简单的TCP应用程序
1.服务端
import socket # 创建一个ipv4的 tcp/ip协议的套接字,‘AF_INET’, 表示IPv4地址类型,‘SOCK_STREAM’, 表示TCP传输协议类型 tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 开始绑定地址端口,参数数元组,(ip地址, 端口号) tcpSocket.bind(('', 12345)) # 设置监听,最大等待建立连接的个数 tcpSocket.listen(5) while True: print("服务器等待连接。。。。。") # 等待接受客户端的连接请求,返回套接字和客户端ip端口 clientSocket, client_addr = tcpSocket.accept() print(f"已经连接到客户端,地址为:{client_addr}") try: while True: # 接收客户端的数据并解码 recv_data = clientSocket.recv(1024).decode('utf-8') print(f"接收客户端的数据为:{recv_data}") if recv_data.lower() == "exit": print(f"断开与客户端{client_addr}的连接!") break # 数据编码后发给客户端 clientSocket.send(f"客户端{client_addr},接收到你的数据数据为:{recv_data}".encode('utf-8')) except Exception as e: print(e) finally: # 断开与客户端连接 clientSocket.close()
上述服务端同一时间只能和一个客户端进行通信,当前连接的客户端关闭后下一个客户端才能与服务器通信。
要想同时和多个客户端保持通信,可使用多线程,代码如下:
import threading, socket def conn_client(server_client_socket, ipaddr): print(f"客户端{ipaddr}成功连接!") while True: # 接收客户端的数据并解码,参数表示每次最大接收多少数据,单位是字节 recv_data = server_client_socket.recv(1024).decode('utf-8') print(f"接收到客户端{ipaddr}的数据:{recv_data}") # 往客户端发送数据 server_client_socket.send(f"你好,{ipaddr},成功接收到:{recv_data}".encode('utf-8'), ) if not recv_data or recv_data.lower() == 'exit': break server_client_socket.close() print(f"{ipaddr}连接关闭!") if __name__ == '__main__': # 创建服务端socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口 server_socket.bind(('', 12345)) server_socket.listen(5) while True: # 连接客户端的套接字和ip端口 server_client_socket, ipaddr = server_socket.accept() sub_thread = threading.Thread(target=conn_client, args=(server_client_socket, ipaddr)) # 设置守护进程 sub_thread.daemon = True sub_thread.start()
2.客户端
import socket # 创建一个tcp/ip协议的套接字 clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 开始连接服务器地址 clientSocket.connect(("localhost", 12345)) while True: data = input("发送数据到服务器(exit退出):") if data.lower() == "exit": clientSocket.send("exit".encode('utf-8')) # 关闭当前的客户端 clientSocket.close() break clientSocket.send(data.encode("utf-8")) # 接收服务器发送的数据 data = clientSocket.recv(1024).decode('utf-8') # 打印接收的数据 print(f"接收服务器的数据为:{data}")
分别运行服务端和客户端程序后,就可以进行客户端与服务器的通信。
浙公网安备 33010602011771号