Python tcp:python中的 TCP连接

好吧,伙计们,我不能理解这个代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

What does:

socket.AF_INET
socket.SOCK_STREAM

做什么?我真的读了关于他们的一切,但我不明白他们做了什么,你能用简单的话解释我吗?谢谢你的阅读,祝你有美好的一天!

3
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

让我们回到我们的“real world”例子,让我们想象一下我们同意通过电子邮件进行通信。我可以期待您发送一封电子邮件(向我解释您必须告诉的所有内容)或几封(在每封电子邮件中都必须说一部分)。这与 TCP vs UDP 相同。

References

好吧,我想你已经阅读了两者:

python's socket module python's socket How to

潜在的:

SO:What is Address Family? Wikipedia:IPv4

另外,我猜:

Difference Between Socket Types (以及其中的引用)

Wikipedia:Network socket-Types

超长解释,但主要是测试

所以。如果毕竟你不明白。让我们试试:

# 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参数(但我认为我的答案已经足够长)。

希望这有助于:)。

0

socket.STREAM是您想要的套接字类型。在这种情况下,您希望将字节与要连接的主机进行流传输,而不仅仅是发出一次性调用。这意味着套接字将侦听字节,直到它收到一个空字节b'',此时它将终止连接(因为流已经完成)。

我想你不会太担心套接字的类型,所以这里的低级理解并不是最重要的,我也不能给你一个特别满意的答案。

socket.AF_INET是 AddressFamily,ipv4 或 ipv6。这告诉sockets期望什么样的地址。您很可能会使用 ipv4,因此(主机,端口)元组将正常工作。

0

AF_INET在那里有很好的描述。它基本上是您用于将数据发送到另一个套接字的方法。SOCK_STREAM 基本上描述了您正在使用 TCP 发送,并且基本上描述了您正在发送和接收数据(IP 地址和端口号)的端点的规则。

但既然你似乎对这些术语感到困惑,我建议只是把它们看作是如何在你的两个套接字端点之间传输数据的规范。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(221)
数据备份软件:适用于OSX和Windows的备份软件
上一篇
Python中结束整个程序命令:所有的结束事件都会结束整个过程吗
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(58条)