套接字编程多个客户端 - 一个服务器Python

时间:2017-12-07 14:58:23

标签: python sockets tcpclient tcpserver

对不起,很长的帖子。我正在编写一个TCP套接字服务器,它与两个不同的客户端(client1和client2)进行通信。服务器接收来自client1的请求,并在接收到请求时,服务器将数据发送到client2,然后client2响应所需的数据。

详细地说,client1是一个Android设备,从服务器请求一些位置信息。在接收到请求时,服务器与托管位置信息的计算机(客户端2)通信,并且从客户端2向服务器提供信息。接收的信息进一步从服务器传送到client1(android设备)。

为了实现这一点,我写了以下步骤:
1.由于可能有多个android设备(client1)连接到服务器,因此有一个线程通过端口(port1)处理与client1的连接。 2.一旦服务器从Android设备获得请求,它就与位置客户端(client2)通信并获得所需的数据 3.与client2的通信发生在同一个端口上,并且工作正常 4.从client2接收数据后,服务器必须将获取的数据传回客户端。

我在第4步遇到问题。即,我在函数内部创建了一个套接字,它将数据传输到另一个端口(port2)中的client2并传输数据。但我收到以下错误"地址已在使用"。

为了避免这种情况,我尝试从函数内部通过套接字连接(在port1上创建)传输信息。数据传输失败,即client2没有接收通过套接字发送的数据。

class ClientThread(Thread): 
    def __init__(self,ip,port,obj_socket_connect): 
        Thread.__init__(self) 
        self.obj_socket_connect = obj_socket_connect

    def run(self):
        read_data = conn.recv(2048)
        if read_data == "loc_info_req":
            self.obj_socket_connect.request_for_location()

另一个类,它从client2传递数据并将数据发送到client1。

class socket_connect:
    def __init__(self):
        self.write_android_request_port = Port2

    def request_for_location(self):
        # Information requested to client 2
        self.read_loc_data(c_write)

    def read_loc_data(self,c_read): 
        read_data =  c_read.recv(15) 
        # Data processing for sending the info to client1          
        self.write_to_android_dev_data(read_data)

    # Writing the required information to android on another port
    # The problem of "Address already in use occurs here"
    def write_to_android_dev_data(self,data_to_write):
        s2 = socket.socket()         # Create a socket object
        s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        host = socket.gethostname()
        s2.bind(('', self.write_android_request_port))
        s2.listen(5)
        c_write,address = self.s2.accept()
        c_write.send(data_to_write)
        s2.close()

主要功能如下:

if __name__ == "__main__":
    obj_socket_connect = socket_connect()
    print "Read write ports assigned"
    # Multithreaded Python server : TCP Server for android devices connection
    TCP_PORT = Port1
    BUFFER_SIZE = 20

    tcpServer = socket.socket() 
    tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    tcpServer.bind(('', TCP_PORT)) 
    threads = []

    # Thread is created everytime when new Android device is connected         (client1) 
    while True: 
        tcpServer.listen(4) 
        print "Multithreaded Python server : Waiting for connections from TCP clients..." 
        (conn, (ip,port)) = tcpServer.accept()
        # Calling the thread function and creating the object
        newthread = ClientThread(ip,port,obj_socket_connect) 
        newthread.start() 
        threads.append(newthread) 

    for t in threads: 
        t.join()

以上所有代码都属于同一个文件,这就像TCP服务器一样。

Client1 :( Android设备) android设备通过在Port1上写入发送请求,发送字符串" loc_info_req"。这可以正常工作,因为请求后服务器中的信息可用。收到请求后,服务器与客户端2(另一台计算机)进行通信

客户端2是另一台根据请求发送数据的计算机。 服务器 - Client2数据传输工作正常,但问题是数据必须从服务器传输回client1。

要在Android设备上接收数据,我有以下几行代码:

# When tried to receive the data on Port1, the information is not getting
# transferred here. So, receiving data on another port.
android_loc_client = new Socket(TCP_IP, Port2);
android_loc_client.setSoTimeout(100000);
BufferedReader input_info = new BufferedReader(new   
InputStreamReader(android_loc_client.getInputStream()));
message = input_info.readLine();

注意:我没有足够的积分来上传图片以获得更好的解释。或者我有一个图形表示这里写的东西。数据传输在几次迭代中工作正常,并且在某个时间之后,“#34;地址”的错误已经在使用"错误来了。尝试关闭并关闭服务器内的套接字。仍然存在错误。

0 个答案:

没有答案