Python服务器即时断开连接

Python服务器即时断开连接,python,sockets,telnet,Python,Sockets,Telnet,下面是给我问题的代码: def connect(): s.listen(2) print("Server listening") conn,addr=s.accept() print("Connected with " + str(addr) + '\n') recv() def recv(): while 1: try: print("Starting try statement")

下面是给我问题的代码:

def connect():
    s.listen(2)
    print("Server listening")
    conn,addr=s.accept()
    print("Connected with " + str(addr) + '\n')
    recv()

def recv():
    while 1:
        try:
            print("Starting try statement")
            data=conn.recv(1024)
            if data == "":
                print("No data")
                recv()
            else:
                print("Data")
                print(data.decode('UTF-8') + " -END")
                recv()
        except:
            print("No connection")
            connect()
        conn.close()
当我执行代码时,它将连接到客户机并随时准备接收消息。然而,一旦它被执行,就会出现这种情况

Server listening
Connected with ('xx.xxx.xxx.xx', xxxxx)

Starting try statement
No connection
Server listening
IP审查。有人对此有办法吗

编辑:打字错误

来自TKinter GUI的客户端代码

    s.connect((host,port))
        self.chatlog['state'] = NORMAL
        self.chatlog.insert(END, ("===CONNECTED TO SERVER\n"))
        self.chatlog['state'] = DISABLED
        self.chatlog.yview(END)
        self.conn=True
        print("Connected")

你做错了

现在您在函数connect中创建的本地conn无法从函数recv访问?这是一个没有得到任何东西的原因

我使用该代码(不使用类和线程,但使用select和sys模块)的解决方案是:

import sys
import select

def connect()
    s.listen(2)
    print('Sever listening')
    inputs = [s, sys.stdin]
    running = 1
    while running:
        i_rdy = select.select(inputs,[],[],1)[0]

        if s in i_rdy:
            conn, addr = s.accept()
            print ('Connected with ' + str(addr) + '\n')
            recv(conn)

        if sys.stdin in i_rdy:
            junk = std.stdin.readline()
            if junk.lstrip('\n') == 'exit':
                running = 0
                print('Closing server')

    s.close()

def recv(conn):
    while 1:
        try:
            print("Starting try statement")
            data = conn.recv(1024)
            if data == "":
                print("No data")

            else:
                print("Data")
                print(data.decode('UTF-8') + " -END")

        except:
            print("No connection")
            #traceback
            print(sys.exc_info)
            break
    try:
        conn.close()
    except:
        pass
正如您所看到的,当u型退出到控制台时可以退出,但只有在没有活动连接的情况下


这就是为什么你应该考虑把它重写到课堂上,停止,不难看,它可以处理多个连接会容易很多。从“while 1”循环中,递归地调用自己?conn和connect名称指的是什么?你能提供一个最小的可运行示例吗?是的,我正在使用递归,因为一旦收到数据,我希望服务器准备好接收更多数据。这永远不会起作用-经典无限递归如果你删除代码中的所有recv调用,运行一次recv应该会使它永远恢复。你可能需要一段时间。在recv-loop中找个时间睡觉。非常感谢你的帮助,并给出了合理的解释。这个网站上的其他人没有什么帮助。我将很快对此进行测试,如果它有效,我将对其进行标记。