我有一个运行在Raspberry pi上的TCP服务器/ client。服务器从USB端口读取数据,并将其发送到端口8888和ip“ 0.0.0.0”。我首先使用sudo ./server.py&运行服务器,然后使用sudo ./client.py运行客户端。这两个脚本都位于Rpi上的同一目录中。起初,一切似乎都正常。使用client.py脚本打印的数据与发送到USB端口的数据相对应。由于某些原因,我停止client.py时会出现问题,server.py脚本也会停止,并引发错误“ Error Occured”。我不确定为什么只要客户端停止服务器就会停止。是否可以使服务器即使客户端停止连接也可以继续运行?
##########################################
############ server.py ####################
##########################################
import socket
import serial
host = '0.0.0.0' # Symbolic name meaning all available interfaces
port = 8888 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port)
ser = serial.Serial("/dev/ttyUSB0",9600,timeout = 1)
print(host , port)
s.listen(2)
conn, addr = s.accept()
print('Connected by', addr)
while True:
try:
readTest = ser.readline()
#data = conn.recv(128)
#if not data:
# break
#print(readTest)
conn.sendall(readTest)
except socket.error:
print("Error Occured.")
break
ser.close()
conn.close()
#####################################################
################### client.py #########################
#####################################################
import socket
host = '0.0.0.0'
port = 8888# The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect((host, port))
while True:
data = s.recv(128).decode('utf-8') #2048
print(data)
s.close()
答案 0 :(得分:0)
我不确定为什么只要客户端停止服务器就会停止。
因为如果TCP连接中断,sendall将失败,这将导致您看到异常。如果发生异常,则可以明确地打破循环:
while True:
try:
...
conn.sendall(readTest) <<< this wail fail if the client disconnected
except socket.error:
print("Error Occured.")
break <<< this will leave the while True loop
这是一种即使客户端停止连接也可以使服务器继续运行的方法吗?
鉴于您已明确中断,则可能不会中断循环。尽管目前尚不清楚应该发生什么。假设客户端已断开连接,它将不会接收数据。