【问题标题】:Sending data back and forth from two Raspberry Pi's with socket library使用套接字库从两个 Raspberry Pi 来回发送数据
【发布时间】:2026-02-10 11:05:01
【问题描述】:

我在使用 python 中的 socket.send 和 socket.recv 命令在两个 pi 之间发送数据时遇到了问题。我已经按照 YouTube 上的一个示例来帮助启动代码,但是每当我尝试从服务器向客户端发送其他类型的数据时,服务器就会停止并且客户端会收到一个空值。

服务器:

import socket
import time

host = '192.168.10.100'
port = 9988

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 complete.")
    return s

def setupConnection():
    s.listen(1) # Allows one connection at a time.
    conn, address = s.accept()
    print("Connected to: " + address[0] + ":" + str(address[1]))
    return conn

def dataTransfer(conn):
    while True:
        data = conn.recv(1024) # receive the data
        data = data.decode('utf-8')
        if data == 'kill':
            print("Server is shutting down.")
            s.close()
            break
        elif data == 'test':
            reply = 1
        else:
            reply = 'Unknown Command'
        conn.sendall(reply)
    conn.close()

s = setupServer()

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

客户:

import socket
from time import sleep

host = '192.168.10.100'
port = 9988

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

while True:
    command = input("Enter command: ")
    if command == 'KILL':
        s.send(str.encode(command))
        break
    s.send(str.encode(command))
    reply = s.recv(1024)
    print(reply)

s.close()

当我运行“kill”命令时,它正常工作:

但是当我尝试运行“测试”时,服务器脚本似乎关闭了,客户端似乎收到了一个空值而不是 1。

环顾四周后,我似乎遇到了阻塞/非阻塞问题,或者 socket.send/socket.recv 命令没有传输正确类型的数据。也许我可能还有其他错误?

【问题讨论】:

  • 您是否尝试过在收到"test" 而不是int 时回复字符串"1"
  • 谢谢@BorrajaX 我会试试这个。

标签: python sockets server raspberry-pi client


【解决方案1】:

当满足data=="test" 条件时,您将reply 分配给一个整数值。 socket.sendall 接受 string 参数。试试"1"

作为建议,如果您不熟悉它,这将是使用 pdb 进行调试的好机会。只需import pdb 和您希望程序暂停的任何位置(例如在服务器的 if 块中data=="test"),然后只需声明pdb.set_trace(),如果消息被正确接收,它将打开一个交互式终端。

【讨论】:

  • 谢谢,我会试试这个。调试听起来也很有帮助。
  • 将回复 = 1 设置为回复 = "1" 后,我仍然得到相同的确切结果。服务器关闭,客户端收到一个空值。我也试过 pdb 调试,它似乎没有跟踪。