TCP客户端/服务器:客户端程序停止时服务器中断

时间:2020-07-19 21:58:40

标签: python-3.x sockets raspberry-pi

我有一个运行在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() 

1 个答案:

答案 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

这是一种即使客户端停止连接也可以使服务器继续运行的方法吗?

鉴于您已明确中断,则可能不会中断循环。尽管目前尚不清楚应该发生什么。假设客户端已断开连接,它将不会接收数据。