当前位置: 首页 > 面试题库 >

如何在Python中制作一个能记住客户端的简单多线程套接字服务器

耿弘阔
2023-03-14
问题内容

如何制作一个简单的Python回显服务器,该服务器可以记住客户端并且不为每个请求创建新的套接字?必须能够支持并发访问。我希望能够连接一次并使用此客户端或类似客户端连续发送和接收数据:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = raw_input("Server hostname or ip? ")
port = input("Server port? ")
sock.connect((host,port))
while True:
    data = raw_input("message: ")
    sock.send(data)
    print "response: ", sock.recv(1024)

即使用上面的客户端,服务器在端口50000上运行,我希望能够做到这一点:

me@mine:~$ client.py
Server hostname or ip? localhost
Server Port? 50000
message: testa
response: testa
message: testb
response: testb
message: testc
response: testc

问题答案:

您可以为每个客户端使用一个线程以避免阻塞,client.recv()然后仅将主线程用于侦听新客户端。当一个连接时,主线程创建一个新线程,该新线程仅侦听新客户端,并在60秒钟不讲话时结束。

import socket
import threading

class ThreadedServer(object):
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))

    def listen(self):
        self.sock.listen(5)
        while True:
            client, address = self.sock.accept()
            client.settimeout(60)
            threading.Thread(target = self.listenToClient,args = (client,address)).start()

    def listenToClient(self, client, address):
        size = 1024
        while True:
            try:
                data = client.recv(size)
                if data:
                    # Set the response to echo back the recieved data 
                    response = data
                    client.send(response)
                else:
                    raise error('Client disconnected')
            except:
                client.close()
                return False

if __name__ == "__main__":
    while True:
        port_num = input("Port? ")
        try:
            port_num = int(port_num)
            break
        except ValueError:
            pass

    ThreadedServer('',port_num).listen()

客户端闲置60秒后超时,必须重新连接。看到client.settimeout(60)函数中的行ThreadedServer.listen()



 类似资料:
  • 我正在尝试制作最简单的REST API服务器和客户端,服务器和客户端都用Python编写并在同一台计算机上运行。 来自本教程: https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask 我将此用于服务器: 如果我从命令行运行此命令: 我明白了: 很好,现在我的问题是,如何使用请求来编写Pyt

  • 如何处理多个客户端连接到一个服务器?我有这个logserver.java 和一个嵌入式applet,其中包含如下所示的部分代码,例如 现在的问题是,如果我在服务器上运行“Java日志服务器”,它将打开应用程序并等待输入流,如果我打开我的站点,它将开始流日志。但如果我使用其他计算机/网络再打开一个站点,第二个站点不会记录流。似乎是因为第一个仍然绑定到端口5000。 我该怎么处理?socket实际上是

  • 问题内容: 我想使用asyncio协程而不是多线程来重新实现我的代码。 server.py client.py 我知道有一些适当的异步网络库可以做到这一点。但是我只想在这种情况下使用asyncio核心库,以便对其有更好的了解。 仅在处理客户端定义之前添加async关键字真是太好了……这里的一段代码似乎有效,但是我仍然对实现感到困惑。 asyncio_server.py 如何以最佳方式和使用异步aw

  • 我正在尝试用python创建一个p2p聊天。这个想法是让客户端在出现故障时能够成为服务器。这是为了学习目的,所以我只是在我的笔记本电脑上本地做这个。 但到目前为止,我正在努力实现客户端和服务器之间的通信。 我为服务器打开了一个终端窗口。2个客户端终端窗口。 如果我连接两个客户端,它们都可以向服务器发送消息,服务器将消息广播给所有客户端。但在第二个客户端发送一条消息后,只有一个客户端可以发送消息,但

  • 服务器和客户端使用我自己的协议进行通信,看起来像XMPP。我应该实现聊天应用。因此,当一个用户编写String时,它应该立即通过服务器发送给其他客户端。我在服务器上有sendToAll方法。但用户只有在按下回车键时才能看到其他用户的消息。用户如何在不按回车键的情况下接收消息? 这是我的客户: 以及带有ServerThread的服务器。 服务器线程。

  • 问题内容: 服务器和客户端使用我自己的协议(类似于XMPP)进行通信。我应该实现聊天应用程序。因此,当一个用户写String时,应该立即将其通过服务器发送给其他客户端。我在服务器上有sendToAll方法。但是用户只有在按Enter时才能看到其他用户的消息。 用户如何在不按Enter键的情况下接收消息? 这是我的客户: 和带有ServerThread的服务器。 ServerThread。 问题答案