【问题标题】:Python TCP Socket server store messages from clientsPython TCP Socket服务器存储来自客户端的消息
【发布时间】:2017-11-04 05:30:04
【问题描述】:

我想将来自客户端的所有消息存储在我的“TCP 服务器”上的列表中。

import SocketServer

class MainServerHandler(SocketServer.BaseRequestHandler):
    requests = []

    def handle(self):
            message = self.request.recv(4)
            self.requests.append(message)


HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), MainServerHandler)
server.serve_forever()

当服务器收到第一条消息时,handle 函数将消息附加到列表中。

当服务器收到来自客户端的第二条消息时,之前附加的消息没有任何痕迹。

免责声明:我知道为什么会这样。我只是想不出一种将所有消息存储在列表中的方法。我只想使用SocketServer 来实现这个。

【问题讨论】:

  • 为什么会这样?
  • 我刚刚测试了你的代码,运行它然后多次执行echo -e abcd | nc localhost 9999,每条新消息都会附加到requests
  • 您的代码有效,如下面的回答所示。如果你所拥有的东西不起作用,那是你没有显示的代码。创建minimal reproducible example

标签: python sockets tcp socketserver tcpsocket


【解决方案1】:

请求处理程序为每个客户端连接获取一个新实例,但您已将请求创建为类变量,因此它可以工作:

#!python2
import SocketServer

class MainServerHandler(SocketServer.BaseRequestHandler):
    requests = []
    def handle(self):
            message = self.request.recv(4)
            self.requests.append(message)
            print(self.requests)

HOST, PORT = "", 9999
server = SocketServer.TCPServer((HOST, PORT), MainServerHandler)
server.serve_forever()

客户:

import socket

for i in range(3):
    s = socket.socket()
    s.connect(('localhost',9999))
    s.sendall(b'abc')
    s.close()

来自服务器的输出:

[b'abc']
[b'abc', b'abc']
[b'abc', b'abc', b'abc']

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2019-02-06
    • 2014-09-08
    • 2017-06-18
    • 1970-01-01
    • 2015-09-09
    • 2013-04-29
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多