Python服务器即时断开连接

时间:2014-02-19 16:16:26

标签: 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")
            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")

1 个答案:

答案 0 :(得分:1)

你做错了。

Ya'现在,无法从函数recv访问本地conn你在函数连接中创建的内容吗?这是没有收到任何东西的原因。

我使用该代码的解决方案,不使用类和线程,而是使用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

正如您所看到的,当您输入exit to console时可以“退出”,但只有当没有活动连接时...

这就是为什么你应该考虑将它重写为类,停止它会容易得多,而不是“丑陋”,它可以处理多个连接。