【问题标题】:TCP Connection in pythonpython中的TCP连接
【发布时间】:2019-02-25 03:17:50
【问题描述】:

好吧,伙计们,我看不懂这段代码:

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

做什么:

socket.AF_INET
socket.SOCK_STREAM

做吗? 我真的阅读了有关他们的所有内容,但我无法理解他们的工作,请您用简单的话解释一下吗?感谢阅读,祝您有美好的一天!

【问题讨论】:

  • 如果您不知道常量的用途,请查看docs

标签: python tcp


【解决方案1】:

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

希望这会有所帮助:)。

【讨论】:

  • 多么漂亮的答案啊!!!非常感谢!!!希望你有一个美好的一天!!!!
【解决方案2】:

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

但由于您似乎对这些术语感到困惑,我建议您将它们视为您将如何在两个套接字端点之间传输数据的规范。

【讨论】:

  • AF_INET 表示我的socket将使用IPV4?
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 2023-03-07
    • 2013-09-04
    • 2013-01-11
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多