服务器:
import socket host = "" port = 4242 backlog = 5 size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host,port)) s.listen(backlog) client, address = s.accept() while 1: data = client.recv(size) if data: client.send(data) print(data.decode("utf-8"))
客户:
import socket import sys host = sys.argv[1] port = 4242 size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port)) while True: line = input("What to say: ") s.send(line.encode("utf-8"))
那么,我在这里有点困惑。 我开始学习套接字,所以我开始了一个简单的回声服务器。 我在上面发布的代码在服务器运行在Arch Linux或Ubuntu上的时候效果很好。 当它在Windows 7上时,它只接受本地连接。 事情是,我没有运行防火墙。 我不知道如果Python有一个单独的WinSock实现或什么,但我很困惑! 请,如果你愿意,我很清楚,这是非常devise(只接受客户端!),但我只是想知道为什么Windows不会接受远程连接。
如果有帮助,在Arch和Ubuntu上,我运行在Python 3.1上,而在Win 7上运行在3.2上。
听起来像host=''
是默认绑定到Win 7下的本地主机(127.0.0.1)(我目前没有访问Win 7的机器)。
要使服务器在主机上的所有(IPv4)接口上都可以访问,请在Linux,Windows,Mac等平台上运行:
host = '0.0.0.0' s.bind((host, 8080))
要验证套接字绑定到哪个地址,可以这样做:
>>> s.getsockname() ('0.0.0.0', 8080)
作为Socket的文档说明:
某些行为可能与平台有关,因为调用操作系统套接字API。
我不熟悉Win32网络编程,但是我猜测它可能是一个特定于实现的行为,当你创建一个套接字而没有绑定到一个地址时,会触发它。
我的建议是提高一个抽象层次并使用Socketserver 。