为了账号安全,请及时绑定邮箱和手机立即绑定

python中的TCP连接

python中的TCP连接

青春有我 2021-06-19 14:02:22
好的,我无法理解这段代码:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)有什么作用:socket.AF_INETsocket.SOCK_STREAM做?我真的阅读了关于它们的所有内容,但我无法理解它们的作用,你能用简单的话解释我吗?感谢阅读,祝你有美好的一天!
查看完整描述

3 回答

?
慕容708150

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


希望这有帮助:)。


查看完整回答
反对 回复 2021-06-22
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-06-22
  • 3 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信