繁体   English   中英

python socketserver连接超时

[英]python socketserver connection timeout

我是python socket编程的新手。 我正在尝试创建一个简单的聊天应用程序我试图将数据从客户端程序发送到服务器但在服务器程序中接收我遇到的数据“超时”

我的客户计划 -

import socket
PORT = 3017

def handler(req):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect(("localhost", PORT))
    except socket.error, msg:
        print("error connecting socket")
        s = None
    finally:
        f.close()
    s.settimeout(10.0)
    s.send(req)
    line = s.recv(1024)
    s.close()
    return line


if __name__ == '__main__':
    while(1):
        input = raw_input(">")
        resp = handler(input)
        print resp

我的服务器程序 -

import socket
import SocketServer

class echo_server(SocketServer.StreamRequestHandler):
    def handle(self):
        timeout_telnet = float(2.0)
        self.connection.settimeout(timeout_telnet)

        data = []
        # Read in all the lines.
        while 1:
            try:
                line = self.rfile.readline()
            except BaseException, e:
                # Timeout.
                print("error", e)
                break
            data.append(line)
            print("data in handle method-\n", data)
            self.wfile.write(("echo data- ".join(data)))
            break

        # Goodbye


def main():
    s = SocketServer.ThreadingTCPServer(("", 3017), echo_server)
    try:
        s.serve_forever()
    except KeyboardInterrupt:
        print("Shutting down.")
        s.socket.close() 

if __name__ == "__main__":
    main()

您的问题是因为您在使用流套接字时需要控制消息长度。

那里发生了什么:

您的客户端发送一些数据(N字节)。 您的服务器从套接字读取数据,但它不知道您的“消息”是完整还是将发送一些其他数据。

你能做什么? 如果你要更换

self.rfile.readline()

with self.request.recv(10) - 您的服务器将读取10个字节并将其发回。 因此,您可以为服务器和客户端将相互发送的消息设置一些消息大小。

另外一些有用的信息在这里: https//docs.python.org/2/howto/sockets.html#using-a-socket

这是最简单的聊天示例:

客户

def handler(req):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("localhost", PORT))
    message = req
    s.send(req)
    print s.recv(1024)
    s.close()

服务器

def handle(self):
    while True:
        line = self.request.recv(1024)
        if line:
            print("data in handle method-\n", line.strip())
            self.wfile.write(line)

但是你可能会在以后遇到一些问题,python文档可以帮助你理解它是如何工作的。

真正的问题是服务器正在等待从客户端发送更多消息,导致超时。 我找到了一个正在运行的解决方案在客户端程序中添加此行

s.shutdown(1)

s.send(req)

并在服务器程序中替换

line = self.rfile.readline()

line = self.request.recv(1024)

shutdown(1)告诉服务器“此客户端已完成发送,但仍可以接收”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM