【问题标题】:Is it possible to listen for client connection to a server without pausing the whole code?是否可以在不暂停整个代码的情况下侦听客户端与服务器的连接?
【发布时间】:2018-02-05 01:43:44
【问题描述】:

最近,在厌倦了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 的函数,而不是暂停整个代码。任何事情都将不胜感激。

提前谢谢你

【问题讨论】:

标签: python multithreading sockets tcp


【解决方案1】:

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

#!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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 2015-05-21
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多