python中的TCP连接

时间:2018-09-20 18:46:57

标签: python tcp

好的,我听不懂这段代码:

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

做什么:

socket.AF_INET
socket.SOCK_STREAM

吗? 我真的很喜欢阅读它们的全部内容,但是我不明白它们的功能,请您用简单的语言向我解释一下,谢谢阅读,祝您度过愉快的一天!

3 个答案:

答案 0 :(得分: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 :)"

并重新启动我们的 new 客户:

$ 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中查找与{ {1}}(适用于IPv6):

127.0.0.1

和我们的服务器:

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

希望这会有所帮助:)。

答案 1 :(得分:0)

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

我想您可能不太担心套接字的类型,因此这里的低级理解不是最重要的,或者我也不能给您一个特别令人满意的答案。

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

答案 2 :(得分:0)

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

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