在Python中使用socketserver的广播聊天服务器

2024-10-02 18:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,我使用socketserver来创建一个服务器,它将从一个客户端接收到的所有消息广播到所有连接的客户端,但是遇到了一个问题。最后我得到了以下错误:

Exception happened during processing of request from ('127.0.0.1', 14872) Traceback (most recent call last): File "C:\Users\umair\AppData\Local\Programs\Python\Python35-32\lib\socketserver.py", line 628, in process_request_thread self.finish_request(request, client_address) File "C:\Users\umair\AppData\Local\Programs\Python\Python35-32\lib\socketserver.py", line 357, in finish_request self.RequestHandlerClass(request, client_address, self) File "C:\Users\umair\AppData\Local\Programs\Python\Python35-32\lib\socketserver.py", line 684, in init self.handle() File "C:\Users\umair\Desktop\socketserverthread_server.py", line 52, in handle clients.send(data) OSError: [WinError 10038] An operation was attempted on something that is not a socket

我的服务器代码如下:

import socketserver
import threading


host = '127.0.0.1'
port = 6666

all_clients = []

class ThreadingHandler (socketserver.BaseRequestHandler):

    def handle(self):
        if (self.request) not in all_clients:
            all_clients.append(self.request)
        data = self.request.recv(1024)
        print('%s writes: ' % str(self.client_address), end = " ")
        print(data.decode())
        for clients in all_clients:
            clients.send(data)

class ThreadingServer (socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass


myserv = ThreadingServer((host, port), ThreadingHandler)

t = threading.Thread(target = myserv.serve_forever)
t.setDaemon(True)
t.start()

print('The server is online')

客户代码是:

^{pr2}$

我正在运行其中两个客户端代码来测试它。来自客户端的第一条消息不会被广播,而只是由同一个客户端接收。在发送第二条消息时,我收到了上述错误。问题是不是因为我在每个循环中都创建了一个新的套接字?我必须在循环中创建套接字,因为如果不创建,则无法连续发送和接收。我认为socket对象在请求和响应之后被销毁。我不知道发生了什么事。所以任何帮助都是感激的。谢谢您。在


Tags: inpyself消息客户端datarequestline
1条回答
网友
1楼 · 发布于 2024-10-02 18:22:26

On sending the second message, I receive the above mentioned error. Is it the problem due to the fact that I am creating a new socket in every cycle? … I think the socket object is destroyed after a request and a response. I have no idea what's going on.

您确实知道发生了什么;实际上,在将新套接字分配给变量时,客户机上一个循环循环中的套接字对象sock被销毁,这将导致旧的套接字被关闭。但是与此无关的是,服务器已经关闭了它的请求套接字,因为使用了socketserver,就在一个请求被处理之后,即handle(self)返回之后。上面提到的错误是由于忽略了在all_clients中考虑这个封闭的套接字对象而引起的,可以这样做,例如:

        for clients in all_clients[:]:
            if clients._closed: all_clients.remove(clients)
            else:               clients.send(data)

The first message from a client doesn't get broadcast, and is just received by the same client.

消息确实得到了广播(发送到每个客户机),只是另一个客户机并不费心接收它,因为它正在等待input('You: ')。在

I have to create the socket in the loop because if I don't, then I cannot send and receive continuously.

这在某种意义上是正确的,因为您使用socketserver,它在每次请求后关闭连接-对于聊天服务器来说没有太大帮助。
请参阅问题“Handle multiple requests with select”,以获得一个没有socketserver等带来的麻烦的示例服务器。在

相关问题 更多 >