Python将两个客户机连接到一个服务器会导致第一个客户机

2024-04-26 22:18:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个简单的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行(接收和打印服务器发送的任何数据) 任何帮助都将不胜感激。你知道吗


Tags: importselfipsendmessagedata客户机if
1条回答
网友
1楼 · 发布于 2024-04-26 22:18:05

最可能的原因是发送和接收例程中的递归,我将它们改为循环。你知道吗

def recv():
    while True:
        data = s.recv(BUFFER_SIZE).decode()
        if not data: break
        print(data)

def send():
    while True:
        message = str(input())
        if message != "/exit":
            message = name + ": " + message
        s.send(message.encode())

这里给出了关闭这些线程的解决方案:Is there any way to kill a Thread in Python?

但是在这种情况下,在客户机中不需要在单线程中运行发送和接收。你知道吗

编辑: 我又仔细读了一遍你的密码。在客户机中,作为线程启动send和receive方法。send线程在线程中没有为它的消息字符串获取任何输入,因为您循环了它,所以它会将空消息发送到服务器,或者(在我的情况下)带着错误退出。你知道吗

相关问题 更多 >