目录
1. python3编码转换
2. TCP网络应用程序开发
2.1 概述
2.2 开发流程
2.3 TCP客户端程序开发
2.4 TCP服务端程序开发
2.5 注意点
3. socket之send和recv原理
4. 案例
1. python3编码转换
1.网络传输是以二进制数据进行传输的。
2.数据转化用到了encode和decode函数:
- str.encode(encoding="utf-8")
- bytes.decode(encoding="utf-8")
2. TCP网络应用程序开发
2.1 概述
1.TCP网络应用程序开发分为客户端程序开发和服务端程序开发。
2.主动发起建立连接请求的是客户端程序。
3.等待接受连接请求的是服务端程序。
2.2 开发流程
2.3 TCP客户端程序开发
1.创建客户端套接字对象(买电话)
2.和服务端套接字建立连接(打电话)
3.发送数据(说话)
4.接收数据(接听)
5.关闭客户端套接字(挂电话)
import socket
if __name__ == '__main__':
# 1.创建客户端套接字对象(AF_INET表示IP地址类型是IPv4,SOCK_STREAM表示传输协议类型是TCP)
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.和服务端套接字建立连接
tcp_client_socket.connect(("192.168.56.1",8080))
# 3.发送数据
tcp_client_socket.send("nihaoma".encode(encoding="utf-8"))
# 4.接受数据(recv阻塞等待数据的到来)
recv_data = tcp_client_socket.recv(1024)
# decode函数的字符集默认是utf-8
print("客户端接收到的数据:",recv_data.decode())
# 5.关闭客户端套接字
tcp_client_socket.close()
客户端发送:
nihaoma
服务端接收:
服务端发送:
客户端接收:
2.4 TCP服务端程序开发
1.创建服务端套接字对象
2.绑定IP地址和端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字
import socket
if __name__ == '__main__':
# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用(程序退出时,端口号立即释放)
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 2.绑定IP地址和端口号
# tcp_server_socket.bind(("192.168.43.163",8888))
# 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
tcp_server_socket.bind(("", 8888))
# 3.设置监听(128代表服务端等待排队连接的最大数量)
tcp_server_socket.listen(128)
# 4.等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
conn_socket, ip_port = tcp_server_socket.accept()
print("客户端地址:", ip_port)
# 5.接收数据
recv_data = conn_socket.recv(1024)
print("服务端接收到的数据:",recv_data.decode())
# 6.发送数据
conn_socket.send("nihao".encode())
# 7.关闭套接字
conn_socket.close()
tcp_server_socket.close()
客户端发送:
服务端接收:
服务端发送:
nihao
客户端接收:
2.5 注意点
3. socket之send和recv原理
不管是recv还是send都不是直接接收到对方的数据和发送数据到对方。
发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取。
发送数据和接收数据最终是由操作系统控制网卡来完成。
4. 案例
开发一个多任务版TCP服务端程序,实现一个服务端同时服务多个客户端。
分析:多个需要用到循环,同时需要用到多线程。
import socket
import threading
def handle_client(conn_socket):
# 3.5接收数据
recv_data = conn_socket.recv(1024)
print("服务端接收到的数据:", recv_data.decode())
# 3.6发送数据
conn_socket.send("nihao".encode())
# 3.7关闭与客户端通信的套接字
conn_socket.close()
if __name__ == '__main__':
# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 2.绑定IP地址和端口号
# tcp_server_socket.bind(("192.168.43.163",8888))
# 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
tcp_server_socket.bind(("", 8888))
# 3.循环接收客户端的连接请求
while True:
# 3.1设置监听(128代表服务端等待排队连接的最大数量)
tcp_server_socket.listen(128)
# 3.2等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
conn_socket, ip_port = tcp_server_socket.accept()
print("客户端地址:", ip_port)
# 3.3创建多线程用来同时接收多个客户端的请求
sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))
# 3.4启动线程执行任务
sub_thread.start()
# 4.关闭服务端套接字
tcp_server_socket.close()
服务端:
客户端1:
客户端2: