python3+socketserver实现网络聊天及超时断开

一、实现简单的聊天功能定时断开长时间无状态的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()

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值