我在使用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'命令时,它正常工作:
但是当我尝试运行'test'时,服务器脚本似乎关闭,客户端似乎收到一个空值而不是1。
环顾四周之后看起来我可能遇到阻塞/非阻塞问题,或者socket.send / socket.recv命令没有传输正确类型的数据。也许我可能还有其他一些错误?
答案 0 :(得分:1)
点击data=="test"
条件后,您将reply
分配给整数值。 socket.sendall
采用string
参数。试试"1"
。
作为一个建议,如果您不熟悉它,这将是一个使用pdb进行调试的好机会。只需import pdb
以及您希望程序暂停的任何位置(例如,如果在data=="test"
块中,则在服务器中),然后只需一个语句pdb.set_trace()
,它将打开一个交互式终端如果邮件正确收到。