对不起,很长的帖子。我正在编写一个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;地址”的错误已经在使用"错误来了。尝试关闭并关闭服务器内的套接字。仍然存在错误。