Python中服务器发送数据

-1 投票
2 回答
4566 浏览
提问于 2025-04-17 14:56

我正在用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 调用 listenconnect 之后,就不能再调用 connect 了;否则会出现异常(在 POSIX 系统上是 EISCONN,在 Windows 上也有类似的情况)。你需要创建一个新的 socket

第二,客户端是否真的在和服务器同一个端口上 bind 了并且在 listen 监听连接?如果没有,你的 connect 就无法工作。如果有的话,如果客户端和服务器在同一台机器上,bind 也会失败。

第三,从 accept 返回的 addr 是一个 (主机, 端口) 的组合,而不仅仅是主机。所以,按照你现在的写法,你在尝试 connect((('192.168.1.115', 12345), 55001)),这显然是行不通的。

撰写回答