慕容708150
socket.AF_INET=套接字地址的类型socket.SOCK_STREAM=插座类型解释每当您提供socket.AF_INET给您的服务器时,您都会指示它侦听 IPv4 地址,并指示您的客户端连接到 IPv4 地址。这将起作用。IPv6 也一样。然而,将它们混合起来并没有。那将是同样的我等待你在 StackOverflow 上与我交谈,而你通过电子邮件向我发送消息。我们不是在看同一个地方,所以我们将无法交流。同为socket.SOCK_STREAM(和其他值)。不同之处在于它告诉python我们将socket 如何进行通信。socket.SOCK_STREAM将是TCP,而socket.SOCK_DGRAM将是UDP。让我们回到我们的“真实世界”示例,假设我们同意通过电子邮件进行交流。我可以指望任何一个电子邮件从你(我解释你一定要告诉所有)或几个(与你有什么每封电子邮件中说的部分)。这与 TCP 与 UDP 相同。参考好吧,我想你已经读过两篇了:python的socket模块python的套接字如何可能:SO:什么是地址族?维基百科:IPv4另外,我猜:套接字类型之间的差异 (以及其中的引用)维基百科:网络套接字 - 类型超长的解释,但主要是测试所以。如果毕竟你不明白。我们试试看:# server.pyimport sockets = socket.socket()s.bind(('localhost', 5050))s.listen(5)while True: (clientsocket, address) = s.accept() print 'client connected'和:# client.pyimport sockets = socket.socket(socket.AF_INET)s.connect(('127.0.0.1', 5050))print "Yeah! I'm connected :)"到目前为止,一切都在如何。我们启动我们的服务器:$ python server.py然后我们启动我们的客户端:$ python client.pyYeah! I'm connected :)一切正常。那挺好的。现在,让我们改变我们的客户:# client.pyimport sockets = socket.socket(socket.AF_INET6)s.connect(('127.0.0.1', 5050))print "Yeah! I'm connected :)"并重新启动我们的新客户端:$ python client.pyTraceback (most recent call last): File "client.py", line 4, in <module> s.connect(('127.0.0.1', 5050)) File "/.../lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args)socket.error: [Errno 65] No route to host哎呀!一切都破裂了!但是会发生什么? 127.0.0.1:5050是一个 IPv4 地址,因此socket模块告诉我们它对我们正在做的事情不满意!事实上,我们说过我们的连接将使用 IPv6 地址,但我们为其提供了 IPv4 地址。好的...但是如果我使用相同的地址但在 IPv6 中,它会起作用吗?让我们尝试更改我们的客户端(您可以查看此 SO 答案以获取相当于127.0.0.1IPv6 的答案):# client.pyimport sockets = socket.socket(socket.AF_INET6)s.connect(('::1', 5050))print "Yeah! I'm connected :)"和我们的服务器:# server.pyimport sockets = socket.socket(socket.AF_INET6)s.bind(('::1', 5050))s.listen(5)while True: (clientsocket, address) = s.accept() print 'client connected'我们重新启动我们的服务器和我们的客户端:$ python client.pyYeah! I'm connected :)成功!可以使用相同的程序来理解/测试socket.SOCK_STREAM参数(但我认为我的答案已经足够长了)。希望这有帮助:)。