如何在新消息到达时打破 while 循环?

How to break while loop when a new message arrives?

我在ESP as a serverLaptop as a client中使用了Python插座。我从 this site 自定义了套接字代码。当我发送 loop 作为客户端输入时,我在服务器上进入了一个循环。我不知道当我发送 loop 以外的单词时 while loop 是如何被破坏的,例如“你好”。

server.py:

import socket

host = ''
port = 5560

def setupServer():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("Socket created.")
    try:
        s.bind((host, port))
    except socket.error as msg:
        print(msg)
    print("Socket bind comlete.")
    return s

def setupConnection():
    s.listen(1)
    conn, address = s.accept()
    print("Connected to: " + address[0] + ":" + str(address[1]))
    return conn

def Hello_():
    print('Hello')

def Loop_():
    while True:
        print('yes')
        
def dataTransfer(conn):
    while True:
        data = conn.recv(1024) 
        data = data.decode('utf-8')
        dataMessage = data.split(' ', 1)
        command = dataMessage[0]

        if command == 'loop':
            Loop_()
        if command == 'Hello':
            Hello_()         
        else:
            print("X")

    conn.close()

s = setupServer()

while True:
    try:
        conn = setupConnection()
        dataTransfer(conn)
    except:
        break

client.py

import socket

host = '192.168.56.1'
port = 5560

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

while True:
    command = input("Enter your command: ")
    s.send(str.encode(command))
    
s.close()

我知道你的时间很宝贵,感谢你花时间帮助我。

如果希望Loop_()方法在套接字上接收到更多数据时return,可以修改该方法,使其调用select()轮询套接字以查看如果有更多数据到达,如下所示。 (请注意,我已经向 Loop_() 方法添加了一个 conn 参数,因此我可以传入套接字来检查它)

import select

[...]

def Loop_(conn):
    while True:
        print('yes')
        inReady, outReady, exReady = select.select([conn], [], [], 0.0)
        if (conn in inReady):
           print('more data has arrived at the TCP socket, returning from Loop_()')
           break

def dataTransfer(conn):
    while True:
        data = conn.recv(1024)
        data = data.decode('utf-8')
        dataMessage = data.split(' ', 1)
        command = dataMessage[0]

        if command == 'loop':
            Loop_(conn)
        if command == 'Hello':
            Hello_()
        else:
            print("X")

    conn.close()