Discuss / Python / 交作业:实现了一个一段时间没收到消息自动关闭的服务器

交作业:实现了一个一段时间没收到消息自动关闭的服务器

Topic source

明天过后.

#1 Created at ... [Delete] [Delete and Lock User]

之前调试的时候发现出错后Server不会自动终止,只能强行退出,修改后可以实现没有Client访问后30秒自动关闭服务器。

#TCP服务器
#一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。
import socket
import threading
import time

def tcplink(sock, addr):    #定义一个函数,用于处理客户端的连接
    sock.setblocking(True)  #设置阻塞模式,设置为阻塞模式,表示当客户端发送数据时,服务器立即返回数据,而不是等待数据到来。
    start_time = time.time()
    print('Accept new connection from %s:%s...' %addr)  #打印客户端的连接信息
    sock.send(b'Welcome!')  #这里的sock是socket的对象,所以能用sock.send()和sock.recv()
    while True:
        data = sock.recv(1024)  #接收数据,每次1024字节
        time.sleep(1)   #休眠1秒
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send((('Hello, %s!' %data.decode('utf-8')).encode('utf-8'))) #向客户端发送返回信息
    sock.close()    #sock.close()调用关闭的是与客户端建立的连接套接字(socket 对象),而不是关闭服务器套接字s。
    print('Connection from %s:%s closed.' %addr)
def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #创建一个socket对象,SOCK_STREAM(Socket Stream流式套接字)表示TCP协议
    s.bind(('127.0.0.1', 9999))     #绑定IP和端口,小于1024的端口必须使用root用户执行
    s.listen(5) #监听端口,并设置最大连接数
    s.setblocking(False)  # 设置为非阻塞模式
    print('Waiting for connection...')
    start_time = time.time()
#循环等待客户端的连接
    while True:
        try:
            sock, addr = s.accept() #阻塞方式等待客户端的连接,返回一个包含连接套接字和客户端地址的元组
            print('...connected from:', addr)
            t = threading.Thread(target= tcplink, args= (sock, addr))   #创建线程,传入参数sock和addr
            t.start()   #启动线程
        # except BlockingIOError:   #这里是LINUX下的异常处理
        #     pass
        except OSError:

            if time.time() - start_time >= 30:  # 30秒后关闭服务器
                print("Server shutting down...")
                break  # 触发异常以退出主循环
            else:
                pass
    time.sleep(5)  # 等待一段时间确保所有连接都关闭
    s.close()
    print('Server closed.')
    
if __name__ == '__main__':
    main()

  • 1

Reply