一、实现简单的聊天功能定时断开长时间无状态的tcp链接,抛砖引玉作用
服务端代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socketserver
import socket
import threading
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
def __init__(self, request, client_address, server):
self.ip = "" # ip地址
self.port = 0 # 端口
self.time_out = 300 # 设置超时时间变量
self.client_addr = [] # 链接客户端地址
self.client_socket = [] # socket链接对象
super().__init__(request, client_address, server)
def setup(self,):
self.ip = self.client_address[0].strip() # 获取客户端的ip
self.port = self.client_address[1] # 获取客户端的port
self.request.settimeout(self.time_out) # 对socket设置超时时间
print(self.ip+":"+str(self.port)+"连接到服务器!")
self.client_addr.append(self.client_address) # 保存到队列中
self.client_socket.append(self.request) # 保存套接字socket
def handle(self):
while True: # while循环
try:
data = str(self.request.recv(1024), 'ascii')
except socket.timeout: # 如果接收超时会抛出socket.timeout异常
print(self.ip+":"+str(self.port)+"接收超时!即将断开连接!")
break # 跳出while循环
if data: # 判断是否接收到数据
cur_thread = threading.current_thread()
response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
self.request.sendall(response)
def finish(self):
print(self.ip+":"+str(self.port)+"断开连接!")
self.client_addr.remove(self.client_address)
self.client_socket.remove(self.request)
if __name__ == "__main__":
HOST, PORT = "localhost", 9999 #windows
#HOST, PORT = "0.0.0.0", 9999 #Linux
server = socketserver.ThreadingTCPServer((HOST, PORT), ThreadedTCPRequestHandler) #线程
server.serve_forever() #永远运行
客户端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#客户端
import socket
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(">>>",data.decode())
client.close()