两个客户端无法成功连接服务器

4
我希望添加一个特性,让两个客户端可以相互发送消息而不需要等待或停止。
我有一个服务器的脚本:

import socket
import threading
from datetime import datetime
from random import randint

global num
num = 0

class serverThread(threading.Thread):
    def __init__(self, client, address):
        global num
        num = num + 1
        self.id = num
        threading.Thread.__init__(self)
        self.client = client
        self.address = address
        print "serverThread init finished-" + str(self.id)

    def run(self):
        print "r1 num-" + str(self.id)
        size = 1024
        while True:
            #try:
                print "r2*************-" + str(self.id)
                data = self.client.recv(size)
                print "r3..... " + data
                print "r4-" + str(self.id)
                if data:
                    print "r5-" + str(self.id)
                    response = data

                    self.client.send(response)
                    print "r6-" + str(self.id)
                else:
                    print "r7-" + str(self.id)
                    raise Exception('Client disconnected-' + str(self.id) )
            #except:
               # print "Except"
               # self.client.close()
               # return

def create(ipHost, port):
    server = socket.socket()
    server.bind((ipHost, port))
    print "The server was created successfully."
    return server

def listen(server):
    server.listen(5)
    client, address = server.accept()
    c1 = serverThread(client, address)
    c1.start()
    client, address = server.accept()
    c2 = serverThread(client, address)
    c2.start()
    print "finished both threads created"

    while c1.isAlive() and c2.isAlive():
        continue

server = create("0.0.0.0", 1725)
listen(server)

正如您所看到的,我没有使用tryexcept,因为我不太了解如何使用它们。

My second script, the client:

import socket
import threading

class sendThread(threading.Thread):
    def __init__(self, ip, port):
        threading.Thread.__init__(self)
        self.client = socket.socket()
        self.port = port
        self.ip = ip
        self.client.connect((self.ip, self.port))
        print "[+] New send thread started for "+ip+":"+str(port) + "...Everything went successful!"

    def run(self):
        while True:
            data = raw_input("Enter command:")
            self.client.send("Client sent: " + data)

class receiveThread(threading.Thread):
    def __init__(self, ip, port):
        threading.Thread.__init__(self)
        self.client = socket.socket()
        self.ip = ip
        self.port = port
        self.client.connect((str(self.ip), self.port))
        print "[+] New receive thread started for "+ip+":"+str(port) + "...Everything went successful!"

    def run(self):
        print "Entered run method"
        size = 1024
        while True:
            data = self.client.recv(size)
            if data != "" or data:
                print "A client sent " + data
def client():
    port = 1725
    ip = '127.0.0.1'
    print "Connection from : "+ip+":"+str(port)

    receive = receiveThread(ip, port)
    print "b1"
    receive.start()
    print "b2"
    send = sendThread(ip, port)
    print "b3"
    send.start()
    while send.isAlive() and receive.isAlive():
        continue
    print "-----END of While TRUE------"
    print "Client disconnected..."

client()

我想描述一下我的脚本,并逐步介绍我的代码,这可能有助于使其更易读。

问题

在运行两个客户端之前,当我想先运行服务器时,它会打印:

The server was created successfully.

我运行了2个客户端,两个客户端都输出:

Connection from : 127.0.0.1:1720
[+] New receive thread started for 127.0.0.1:1720...Everything went successful!
b1
Entered run method
b2
[+] New send thread started for 127.0.0.1:1720...Everything went successful!
b3
Enter command:

然而,在第二个客户端和服务器之间存在一个问题。我编写了一段代码,当服务器接收到客户端发送的消息时,它会将消息打印为服务器的输出。然而,当第一个客户端发送消息时,它可以正常打印,但是第二个客户端发送消息时就无法打印。
我甚至尝试将客户端脚本复制并放入新文件中,使得两个客户端来自两个不同的文件,以便找到问题。然而,这并没有帮助解决问题。我尝试先运行第一个文件,然后再运行第二个文件,反之亦然。无论如何,第二个客户端都与服务器存在问题。(顺便说一下,我还想知道为什么客户端文件不能打印他自己发送的消息(他仍然会从服务器接收到),但那只是一个次要的问题)。
如果您告诉我代码中的问题,而不是给我一个您创建或找到的代码,我会更加高兴!但是两种方法都可以。
1个回答

1
您正在为每个客户端创建两个连接,一个用于接收,一个用于发送。您的服务器期望恰好有两个连接,即来自第一个客户端的两个连接。请为每个客户端仅创建一个连接:
import socket
import threading

def receive_loop(client):
    print "Entered receive_loop method"
    while True:
        data = client.recv(1024)
        if not data:
            break
        print "A client sent " + data

def main():
    port = 1725
    ip = '127.0.0.1'
    print "Connection from : %s:%s" % (ip, port)
    client = socket.socket()
    client.connect((ip, port))
    receive = threading.Thread(target=receive_loop, args=(client,))
    receive.start()
    while True:
        data = raw_input("Enter command:")
        client.send("Client sent: " + data)

if __name__ == '__main__':
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接