3 回答
TA贡献1831条经验 获得超4个赞
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 相同。
参考
好吧,我想你已经读过两篇了:
可能:
另外,我猜:
套接字类型之间的差异 (以及其中的引用)
超长的解释,但主要是测试
所以。如果毕竟你不明白。我们试试看:
# server.py
import socket
s = socket.socket()
s.bind(('localhost', 5050))
s.listen(5)
while True:
(clientsocket, address) = s.accept()
print 'client connected'
和:
# client.py
import socket
s = socket.socket(socket.AF_INET)
s.connect(('127.0.0.1', 5050))
print "Yeah! I'm connected :)"
到目前为止,一切都在如何。
我们启动我们的服务器:
$ python server.py
然后我们启动我们的客户端:
$ python client.py
Yeah! I'm connected :)
一切正常。那挺好的。
现在,让我们改变我们的客户:
# client.py
import socket
s = socket.socket(socket.AF_INET6)
s.connect(('127.0.0.1', 5050))
print "Yeah! I'm connected :)"
并重新启动我们的新客户端:
$ python client.py
Traceback (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.py
import socket
s = socket.socket(socket.AF_INET6)
s.connect(('::1', 5050))
print "Yeah! I'm connected :)"
和我们的服务器:
# server.py
import socket
s = socket.socket(socket.AF_INET6)
s.bind(('::1', 5050))
s.listen(5)
while True:
(clientsocket, address) = s.accept()
print 'client connected'
我们重新启动我们的服务器和我们的客户端:
$ python client.py
Yeah! I'm connected :)
成功!
可以使用相同的程序来理解/测试socket.SOCK_STREAM参数(但我认为我的答案已经足够长了)。
希望这有帮助:)。
添加回答
举报