1.创建server.py文件作为服务端,代码如下:
#服务端
import socketserver
client_list=[]
class TCPHandler(socketserver.BaseRequestHandler):
# 所有请求的交互都是在handle里执行的,
def handle(self):
while True:
try:
# 每一个请求都会实例化TCPHandler(socketserver.BaseRequestHandler):
self.data = self.request.recv(80000).strip()
client_ip=self.client_address[0]
client_num=self.client_address[1]
if client_num not in client_list:
client_list.append(client_num)
print("来访客户端IP:{} 编号:{}".format(client_ip,client_num))
print("客户端数据:",self.data.decode())
#发送回客户端的数据
self.request.sendall(self.data)
print("-------当前在线客户端编号列表-----------")
print(client_list)
except ConnectionResetError as e:
print("----断开的客户端------")
print("客户端:{} 已经断开".format(client_num))
#如果有客户端掉线,则将它从在线列表中删除
client_list.remove(client_num)
break
if __name__ == "__main__":
HOST, PORT = "127.0.0.1", 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), TCPHandler) #线程
server.serve_forever()
2.创建client.py文件作为客户端,代码如下:
#客户端
import socket
class Client():
def send_info(self):
try:
client = socket.socket() #定义协议类型,相当于生命socket类型,同时生成socket连接对象
client.connect(('127.0.0.1',9999))
while True:
msg = input(">>>").strip()
if len(msg) ==0:continue
client.send(msg.encode("utf-8"))
data = client.recv(1024)#这里是字节1k
print("recv:>",data.decode())
client.close()
except ConnectionError as ex:
print(ex)
if __name__ == "__main__":
client=Client()
client.send_info()
3.测试。启动服务端,运行server.py文件,如下图:
启动服务之后,我们可以将client.py多复制几份更改为不同的名字,模拟多个客户端。如我复制了两份,分别为client.py和client2.py,然后运行这个两个客户端文件。如下图:
启动客户端之后,可以在客户端输入文字内容发送到服务端,如下图,我在client输入 hello
切换到server端面板,如图:
可以看到,它已经收到了客户端1所发送的数据,并将它返回了回去,接着在client2中也输入文字内容,如图:
再次切换到server端面板,如图:
可以看到,在线客户端有两个了。