Python中服务器发送数据
我正在用Python写一个简单的客户端和服务器应用程序。在这个应用中,客户端会监听特定端口上进入的各种数据。当接收到数据流时,我想把一个字符串(在这个例子中是“001”)发送回连接的客户端(这个客户端的IP地址是动态的)。但是当我尝试发送这个消息时,却失败了!
#!/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()
2 个回答
0
你正在尝试用服务器的监听套接字(s
)来回复客户端。这种做法只适用于UDP服务器。因为你现在使用的是TCP服务器,所以你必须使用通过s.accept()
创建的conn
来和远程客户端进行通信。
1
(连接流)套接字是双向的,所以你不需要再调用 connect
来和客户端建立连接——你已经有一个连接了。
不过,你想知道为什么你的代码会出错。其实有至少三个问题。
首先,在你对一个 socket
调用 listen
或 connect
之后,就不能再调用 connect
了;否则会出现异常(在 POSIX 系统上是 EISCONN
,在 Windows 上也有类似的情况)。你需要创建一个新的 socket
。
第二,客户端是否真的在和服务器同一个端口上 bind
了并且在 listen
监听连接?如果没有,你的 connect
就无法工作。如果有的话,如果客户端和服务器在同一台机器上,bind
也会失败。
第三,从 accept
返回的 addr
是一个 (主机, 端口)
的组合,而不仅仅是主机。所以,按照你现在的写法,你在尝试 connect((('192.168.1.115', 12345), 55001))
,这显然是行不通的。