1 回答
TA贡献1815条经验 获得超6个赞
你的问题很简单。
您的客户端连接到服务器
服务器正在创建一个无限循环的新线程
服务器发送一条简单的消息
客户端收到消息
客户端默认关闭连接(!!!),因为您从其方法返回(不再引用)
服务器尝试接收消息,然后继续(错误就在这里)
由于连接已被客户端关闭,因此服务器无法在循环内发送或接收下一条消息,因为它是无限的。这就是错误的原因!此外,在关闭连接的情况下没有错误处理,也没有用于在每一端关闭的协议。
如果您需要一个检查服务器是否在线的函数,您应该创建一个函数(但我确信一个简单的连接就足够了),其工作原理类似于 ping。例子:
客户端功能:
def isOpen(self, ip, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((str(ip), int(port)))
s.send("ping".encode('utf-8'))
return s.recv(1024).decode('utf-8') == "pong" # return whether the response match or not
except:
return False # cant connect
服务器功能:
def clientthread(conn):
while True:
msg = conn.recv(1024).decode('utf-8') #receiving a message
if msg == "ping":
conn.send("pong".encode('utf-8')) # sending the response
conn.close() # closing the connection on both sides
break # since we only need to check whether the server is online, we break
从您之前的问题中,我可以告诉您在理解 TCP套接字通信的工作原理方面存在一些问题。请花点时间阅读一些有关如何通过套接字进行通信的文章。如果您不需要实时通信(连续数据流,如视频、游戏服务器等),仅需要登录表单,请坚持使用众所周知的协议,如 HTTP。如果您刚刚开始套接字编程,创建自己的可靠协议可能会有点复杂。
您可以使用Flask作为 HTTP 后端。
添加回答
举报