tcp服务器使用流程
1. 创建套接字
2. 用bind绑定IP地址和port端口
3. 用listen监听套接字; 使套接字可以变为被动链接
4. 用accept等待客户端的链接
5. 用recv/send收发数据
监听套接字只负责等待有新的客户端链接; accept产生的套接字用来为客户端服务
accept返回值=(产生新的套接字, (监听到的套接字的ip地址,端口))
产生新的套接字用于为客户端服务; 即用新的套接字用来接收recv客户端发来的数据 以及 用新的套接字用来发送send数据给客户端
import socket def main(): """ """ # 创建套接字 tcp_sever = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定服务器 server_ip = input("please input the server's ip:") server_port = int(input("please input the server's port:")) tcp_sever.bind((server_ip,server_port)) # 监听客户端链接 tcp_sever.listen(128) # 能够同时监听128个 # 监听到客服端链接后为客户端服务, accept返回新的套接字和客户端的地址用于接收客户端发来的数据和发送给客户端数据 return_socket, client_address = tcp_sever.accept() # return_socket对应客户端的套接字 print(client_address) # 查看客户端的地址 # 用新的套接字用来接收recv客户端发来的数据 以及 用新的套接字用来发送send数据给客户端 data_client = return_socket.recv(1024) print(data_client.encode("gbk")) # return_socket.send("认识你真好!".encode("gbk")) send_data = input("please input the data you wanna send:") return_socket.send(send_data.encode("gbk")) # 原路返回, 即接收到哪个客户端的就发给哪个 # 关闭套接字 return_socket.close() tcp_sever.close() if __name__=="__main__": main()
对accept函数的理解
accept函数的返回值为: ( 一个新的socket, (监听到的客户端ip地址, 端口号) )
所以使用accept之前必须要用listen()来监听客户端链接
accept函数的返回值的新的socket是为了用来给客户端服务, (监听到的客户端ip地址, 端口号)则是为了让服务器记住客户端地址, 以便服务器可以直接发生数据给客户端
比如:
1. 新的socket.recv(567890) # 接收客户端发来的数据/请求内容
2. 新的socket.send("data") # 服务器发送数据给客户端