TL;DR
socket.AF_INET = The type of socket address
socket.SOCK_STREAM = The type of socket
说明
每当您向服务器提供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 :)"
到目前为止,how to 中的所有内容。
我们启动我们的服务器:
$ 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 中,它会工作吗? 让我们尝试通过更改我们的客户端(您可以查看 this SO answer 以获取相当于 127.0.0.1对于 IPv6):
# 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 参数(但我认为我的答案已经足够长了)。
希望这会有所帮助:)。