TCP服务端
在程序中,如果想要完成一个TCP服务器的功能,需要按照以下流程进行操作:
- 创建套接字socket
- 绑定(IP和端口)
- 监听使套接字变为可被动连接
- 等待客户端的连接请求accept
- 接收/发送数据
- 关闭套接字
示例代码:
from socket import * # 创建socket tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 本地信息 address = ('', 7788) # 绑定 tcp_server_socket.bind(address) # 使用socket创建的套接字默认是主动的,使用listen将其变为被动的,这样就可以接收其他客户端的连接了 tcp_server_socket.listen(128) # 如果有新的客户端来连接服务器,则产生一个新的套接字专门为这个客户端服务 # client_socket用来为这个客户端提供服务,而tcp_server_socket则可以继续等待其他新客户端的连接 client_socket, client_addr = tcp_server_socket.accept() # 接收对方发送过来的数据 recv_data = client_socket.recv(1024) # 接收1024个字节 print('接收到的数据为:', recv_data.decode('gbk')) # 发送一些数据到客户端 client_socket.send("thank you !".encode('gbk')) # 关闭为这个客户端服务的套接字,只要关闭了,就不能再为这个客户端服务 # 如果还需要服务,只能重新连接 client_socket.close()
TCP注意事项
- TCP服务器一般需要进行绑定,否则客户端无法找到该服务器。
- TCP客户端一般不需要绑定,因为它是主动连接服务器的,只要确定了服务器的IP和端口等信息即可,而本地客户端可以随机选择。
- TCP服务器通过listen可以将socket创建出来的主动套接字变为被动套接字,这是编写TCP服务器时必须的操作。
- 当客户端需要连接服务器时,需要使用connect进行连接。与UDP不同,TCP必须先建立连接才能通信。
- 当一个TCP客户端连接到服务器时,服务器端会创建一个新的套接字,用于标识该客户端,并为该客户端提供服务。
- listen之后的套接字是被动套接字,用于接受新客户端的连接请求,而accept返回的新套接字则用于标识这个新客户端。
- 关闭listen之后的套接字意味着被动套接字关闭了,此时新的客户端将无法连接到服务器,但之前已经连接成功的客户端依然可以正常通信。
- 关闭accept返回的套接字意味着该客户端已经完成服务。
- 当客户端的套接字调用close后,服务器端的recv方法将解阻塞,并返回长度为0的数据,因此服务器可以通过返回的数据长度来区分客户端是否已经下线。