簡體   English   中英

如何使用套接字發送和接收整個文本消息(而不僅僅是一部分)

[英]How to send and receive whole text message (not just a part) using socket

我正在嘗試使用SocketServer創建一個非常簡單的(行)服務器。 我是這方面的新手,問題是我不知道如何處理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讀取整行。

  • 問題可能出在process_command ,請顯示您的代碼。

  • 您的循環不處理EOF(客戶端關閉)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM