Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用套接字发送和接收整个文本消息(而不仅仅是一部分)_Python_Sockets_Tcp_Recv - Fatal编程技术网

Python 如何使用套接字发送和接收整个文本消息(而不仅仅是一部分)

Python 如何使用套接字发送和接收整个文本消息(而不仅仅是一部分),python,sockets,tcp,recv,Python,Sockets,Tcp,Recv,我正在尝试使用SocketServer创建一个非常简单的(行)服务器。我对are完全陌生,问题是,我不知道如何处理recv函数。我不想发送文件之类的东西。只需从客户端写入文本,并从服务器得到可能更大的响应(ipconfig等的输出) 你能给我一个建议怎么做吗 当我想从服务器请求更长的时间时,例如ipconfig/all,它会将所需输出的一小部分返回给我的客户端并等待。如果作为客户机执行新请求,它将返回上一个请求的其余输出 这是服务器: class ThreadedTCPServer(Socket

我正在尝试使用
SocketServer
创建一个非常简单的(行)服务器。我对are完全陌生,问题是,我不知道如何处理
recv
函数。我不想发送文件之类的东西。只需从客户端写入文本,并从服务器得到可能更大的响应(ipconfig等的输出)

你能给我一个建议怎么做吗

当我想从服务器请求更长的时间时,例如
ipconfig/all
,它会将所需输出的一小部分返回给我的客户端并等待。如果作为客户机执行新请求,它将返回上一个请求的其余输出

这是服务器:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    daemon_threads = True


class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        while 1:
            data = self.request.recv(1024)
            output = process_command(data)

            response = "{}".format(output)
            self.request.sendall(response)


if __name__ == "__main__":

    HOST, PORT = _host, int(_port)

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)

    print "Running on: %s:%s" % (HOST, PORT)
    server.serve_forever()
行中:

data = self.request.recv(1024)

1024是数据字符串可以包含的位数的限制器,因此1024位==128字节==128字符串。将数字增加到4096,则限制将增加到512

有几个问题

  • recv
    是一个低级函数,您可能会在需要连接在一起的几个块中接收TCP客户端的输入。如果您的“协议”是面向行的,请使用
    makefile
    创建一个类似文件的对象,然后您可以使用
    readline
    读取整行内容

  • 问题可能出在
    进程\u命令中,请显示您的代码

  • 您的循环不处理EOF(客户端关闭)


我已经尝试将其更改为4096,但这还不够。我考虑了一些循环,在这个循环中,我一直接收消息,直到完成…只需一直乘以8,直到限制足够大。此外,也可以在行尾添加.strip(),或导入re以删除行首的空行或空格,以清理格式并减少字符串的长度。data=self.request.recv(1024)。os.linesep.join([s代表text中的s.splitlines(),如果s])应该从字符串中删除空行(如果已导入操作系统)。希望这有帮助增加缓冲区大小没有帮助,
recv
参数不是位。