1. 简单版本---同一主机上的不同程序之间的通信
# server.py import socket sk=socket.socket() # 拿到一个socket对象 sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(('127.0.0.1',8080)) # 绑定一个IP地址 和一个端口号 sk.listen() # 服务器端开始监听 conn,addr=sk.accept() # 拿到一个客户端的连接和一个地址(走的TCP协议,这时候已经完成三次握手,已经建立连接了) # 阻塞,等待客户端的连接,会一直等待,直到客户端来连接 print(addr) while True: ret=conn.recv(1024).decode('utf-8') # 阻塞,直到接收到客户端发来一个消息,只要连接conn recv接收消息就会阻塞,等待消息,拿不到一直等 print(ret) if ret=='bye': break info=input(">>>") conn.send(bytes(info.encode('utf-8'))) # 不阻塞,消息直接发出去 conn.close() # 关闭连接,说明TCP之间的连接断开了, sk.close() # 关闭socket对象,如果不关闭还可以使用sk.accept()再次建立连接,跟客户端收发消息
# client.py import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True: info=input(">>>") sk.send(bytes(info.encode('utf-8'))) # 客户端不需要启服务,sk.connect(('ip',port))直接就会拿到一个连接sk ret=sk.recv(1024).decode('utf-8') print(ret) if ret=='bye': sk.send(bytes('bye'.encode('utf-8'))) break sk.close()
2. 一个server端,多个client端
由于基于TCP的连接都是长连接,也就是当server和一个client建立连接之后,在两者不断开之前,就会一直连着,即使有i其他的client来连server端,这个新来的client端会先一直等着,直到前面的client端和server断开连接,也就是说多个client端和一个server端相连时,同一时间server端之和一个client通话,但是和一个client端断开连接后还可以继续和其他的client继续建立连接;
# server.py import socket sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(('127.0.0.1',8080)) sk.listen() while True: conn, addr = sk.accept() while True: ret=conn.recv(1024).decode('utf-8') print(ret) if ret=='bye': break info=input(">>>") conn.send(bytes(info.encode('utf-8'))) conn.close() sk.close()
# client1.py import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True: info=input("client1>>>") sk.send(bytes(('client1:'+info).encode('utf-8'))) ret=sk.recv(1024).decode("utf-8") print(ret) if ret=='bye': sk.send(bytes('bye'.encode('utf-8'))) break sk.close()
# client2.py import socket sk=socket.socket() sk.connect(('127.0.0.1',8080)) while True: info=input("client2>>>") sk.send(bytes(('client2:'+info).encode('utf-8'))) ret=sk.recv(1024).decode("utf-8") print(ret) if ret=='bye': sk.send(bytes('bye'.encode('utf-8'))) break sk.close()
运行结果: