Python socket 仅接受本地连接
服务器:
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在Windows上是否有单独的WinSock实现,反正我就是搞不懂!请你们帮帮我,我知道这个设计很糟糕(只接受客户端连接!),但我只想知道为什么Windows不接受远程连接。
如果有帮助的话,我在Arch和Ubuntu上用的是Python 3.1,而在Windows 7上用的是3.2。
2 个回答
0
根据Socket的文档说明:
某些行为可能会依赖于平台,因为这些调用是对操作系统的socket API进行的。
我对Win32网络编程不太熟悉,但我猜测,当你创建一个socket而没有把它绑定到一个地址时,可能会触发一些特定于实现的行为。
我的建议是提高一个抽象层次,使用SocketServer。
8
听起来 host=''
在Windows 7下默认是绑定到本地地址(127.0.0.1)。我现在没有Windows 7的机器可以确认。
如果你想让你的服务器在所有(IPv4)网络接口上都能被访问,这个方法在Linux、Windows、Mac等系统上都可以用:
host = '0.0.0.0'
s.bind((host, 8080))
要检查这个套接字绑定到了哪个地址,你可以这样做:
>>> s.getsockname()
('0.0.0.0', 8080)