使用套接字库从两个Raspberry Pi中来回发送数据

时间:2016-10-24 23:00:59

标签: python sockets server raspberry-pi client

我在使用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'命令时,它正常工作:

server side

client side

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

server side test

client side test

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

1 个答案:

答案 0 :(得分:1)

点击data=="test"条件后,您将reply分配给整数值。 socket.sendall采用string参数。试试"1"

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