我试图创建一个简单的python聊天界面,但是当两个客户机连接到服务器时,第一个客户机控制台会以尽可能快的速度打印空格,并导致最大递归深度错误,而第二个客户机仍然可以正常工作。服务器代码只发送数据时,它不是空的,所以我不知道为什么它这样做。你知道吗
服务器代码:
import socket
from threading import Thread
from socketserver import ThreadingMixIn
class ClientThread(Thread):
def __init__(self,ip,port):
Thread.__init__(self)
self.ip = ip
self.port = port
print("[+] New thread started for "+ip+": "+str(port))
def run(self):
while True:
data = conn.recv(1024).decode()
if not data: break
if data == "/exit":
print("Connection for "+ip+" closed.")
data = "Connection closed."
conn.send(data.encode())
break
else:
print("received data: ", data)
if data != " ":
conn.send(data.encode())
print("connection "+ip+" force closed.")
TCP_IP = socket.gethostname()
TCP_PORT = 994
BUFFER_SIZE = 1024
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind((TCP_IP, TCP_PORT))
threads = []
while True:
tcpsock.listen(4)
(conn, (ip,port)) = tcpsock.accept()
newthread = ClientThread(ip,port)
newthread.start()
threads.append(newthread)
for t in threads:
t.join()
客户代码:
import socket
import threading
from threading import Thread
TCP_IP = socket.gethostname()
TCP_PORT = 994
BUFFER_SIZE = 1024
name = str(input("Input username: "))
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
def recv():
while True:
data = s.recv(BUFFER_SIZE).decode()
if not data: break
print(data)
recv()
def send():
message = str(input())
if message != "/exit":
message = name + ": " + message
s.send(message.encode())
send()
if __name__ == "__main__":
Thread(target = recv).start()
Thread(target = send).start()
错误在客户机代码的第19行(接收和打印服务器发送的任何数据) 任何帮助都将不胜感激。你知道吗
最可能的原因是发送和接收例程中的递归,我将它们改为循环。你知道吗
这里给出了关闭这些线程的解决方案:Is there any way to kill a Thread in Python?
但是在这种情况下,在客户机中不需要在单线程中运行发送和接收。你知道吗
编辑: 我又仔细读了一遍你的密码。在客户机中,作为线程启动send和receive方法。send线程在线程中没有为它的消息字符串获取任何输入,因为您循环了它,所以它会将空消息发送到服务器,或者(在我的情况下)带着错误退出。你知道吗
相关问题 更多 >
编程相关推荐