是否可以在不暂停整个代码的情况下监听客户端与服务器的连接?

时间:2017-08-27 18:15:05

标签: python multithreading sockets tcp

最近,在陷入无聊的python之后,我决定开始在python中学习socket编程。它进展顺利,我能够建立TCP连接。

后来我开始在代码中添加GUI以使其更好。问题是当我调用函数s.listen()时,整个代码暂停直到客户端连接,这对于我的GUI模块(Pygame)来说是不可接受的,因为它会导致滞后并破坏我的事件处理循环。所以我想知道是否有其他方法来检查客户端是否连接到我的服务器而不会暂停整个循环。

我确实尝试过多线程:

#Wait for Connection then accept
Connection = False
def a():
    global Connection
    text = 'waiting for connection'
    while Connection==False:
        print(text)
        time.sleep(1)
        if text == 'waiting for connection...':
            text = 'waiting for connection'
        else:
            text = text+'.'
def b():
    global Connection
    s.listen(1)
    print("con")
    Connection=True

WaitScreen = threading.Thread(target=a)
WaitClient = threading.Thread(target=b)
WaitScreen.start()
WaitClient.start()

但无济于事。

如果您有任何想法,请通知我。 Stack Overflow这是我最后的选择。我已经浏览了谷歌和我的每本书。也许一个函数只在客户端尝试连接时返回true,而不是暂停整个代码。任何人都会非常感激。

提前谢谢

1 个答案:

答案 0 :(得分:0)

线程工作,即使使用阻塞套接字也是如此。在下面的示例中,服务器线程将阻止等待连接,并且客户端线程将阻止等待接收数据,但主程序将继续运行:

#!python3.6
import threading
import socket
import time

def server():
    s = socket.socket()
    s.bind(('',8000))
    s.listen(1)
    while True:
        conn,addr = s.accept() # will block here until client connects
        t = threading.Thread(target=client,args=(conn,addr),daemon=True)
        t.start()

def client(conn,addr):
    print(addr,'connected')
    while True:
        data = conn.recv(1024) # will block here waiting for data
        if not data:
            break
        print('got:',data)
    print(addr,'disconnected')
    conn.close()

server = threading.Thread(target=server,daemon=True)
server.start()
i = 0
# This will keep running
while True:
    print('-\|/'[i%4],end='\r',flush=True)
    time.sleep(.1)
    i += 1