-1

我正在用python编写一个简单的客户端服务器应用程序,客户端正在侦听进入特定端口的每种类型的数据,并且我想在接收数据流时发送回连接的客户端(具有动态IP)一个字符串,在本例中为“001”。但是当我尝试发送消息时,它失败了!

#!/usr/bin/env python

import socket

TCP_IP = '192.168.1.115'        
TCP_PORT = 55001   
BUFFER_SIZE = 1024      
MESSAGE = '01'  

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
s.bind((TCP_IP, TCP_PORT))     
s.listen(1)     

conn, addr = s.accept()         
print ('Connection address:', addr)      
while 1:       
    data = conn.recv(BUFFER_SIZE)     
    if not data: break      
    print ('received data:', data)      
    conn.send(data)  # echo       

print ('Sending data to client...')   

addr change every connection .. i cannot manage this! 

s.connect((addr, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()   
4

2 回答 2

1

(连接流)套接字是双向的,因此无需调用connect即可获得与客户端的连接——您已经拥有一个。

但是你想知道你的代码为什么会失败。它至少存在三个问题。

首先,在你调用listenconnecta之后socket,你不能再调用connect;你会得到一个例外(EISCONN在 POSIX 上,在 Windows 上是等效的)。您将不得不创建一个新的socket.

其次,客户端实际上是在与服务器相同的端口上进行连接的binded 和ing 吗?listen如果没有,你connect就不能工作。如果是这样,bind如果客户端和服务器在同一台机器上,则会失败。

第三,addr你得到的accept是一(host, port)对,而不仅仅是一个主机。所以,正如所写,你正在尝试connect((('192.168.1.115', 12345), 55001)),这显然是行不通的。

于 2013-02-06T09:14:05.433 回答
0

您正在尝试使用服务器侦听套接字 ( s) 回复客户端。这仅在 UDP 服务器中才有可能。由于这是一个 TCP 服务器,您必须使用conns.accept()来与远程客户端通信。

于 2013-02-06T09:18:45.630 回答