这条线意味着什么? s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

时间:2018-03-31 07:10:21

标签: python sockets oop networking

这条线是什么意思?

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

这种语法对socket.socket()和socket.AF_INET`意味着什么? 我们不能只使用AF_INET和Stream作为参数吗?

import socket # for socket
import sys 

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print "Socket successfully created"
except socket.error as err:
    print "socket creation failed with error %s" %(err)

# default port for socket
port = 80

try:
    host_ip = socket.gethostbyname('www.google.com')
except socket.gaierror:

    # this means could not resolve the host
    print "there was an error resolving the host"
    sys.exit()

# connecting to the server
s.connect((host_ip, port))

print "the socket has successfully connected to google \
on port == %s" %(host_ip)

3 个答案:

答案 0 :(得分:1)

对象名称驻留在名称空间 - 包含名称的空间。模块(例如,socket)具有自己的命名空间。语法是:

namespace.name

所以socket.socket表示来自socket模块的socket名称(恰好是一个函数) - 模块名称首先是函数名称。如果我们省略命名空间,那么它将假定当前的命名空间,在一个简单的单个文件程序中称为__main__

我们可以安排它,所以我们将名称导入我们自己的命名空间,不需要指定模块名称,这就是你要求的:

from socket import *

危险有几个原因,称为名称空间污染

一个是我们无法轻易确定某些内容来自何处 - 您展示的代码非常短且不典型。

另一个原因是命名空间冲突。如果两个模块都使用相同的名称,例如closedown,该怎么办?定义的最后一个是将要使用的那个 - 没有警告说一个人屏蔽了另一个因为python被设计为动态的。

所以我们知道socket.socket来自socket模块,而不是来自描述汽车工具或涉及电路的模块。如果我们希望我们可以在同一个程序中使用所有三个,但我们必须首先指定命名空间。

不幸的是,你会看到from module import *非常多,因为人们很懒。你可以在一个小程序中侥幸逃脱它,但你会冒险 - 随着时间的推移,程序变得越来越大,越来越复杂,它们永远不会变得更小更简单。

还有其他方法可以使用import:您可以限制只导入某些名称,并且可以创建别名,但在使用它们之前,您应该了解有关编程的更多信息。他们有自己的用途,但在适当的时候做出判断决定。

答案 1 :(得分:1)

您已导入socket模块,因此您使用的该模块中的所有内容都将包含" socket."在它面前。

所以socket.socket()表示从socket()模块运行socket函数。

您必须编写socket.AF_INET,因为AF_INET也来自socket模块,因此这意味着从AF_INET模块获取socket常量。类似的逻辑适用于socket.SOCK_STREAM

有关套接字的更多信息:https://docs.python.org/2/library/socket.html

此外,在学习一般代码方面,复制代码然后尝试理解它可以工作,但尝试理解底层概念然后编写自己的代码会更加强大。

答案 2 :(得分:0)

许多Python标准库是底层系统库的相当薄的包装器。它们揭示了底层操作系统设施的许多特性,您必须熟悉底层系统才能正确理解它们的语义。

如果您真的想了解套接字,那么该主题有许多优秀的介绍。他们中的大多数人都需要熟悉C,这可能会让人分心(但如果你希望花更多的时间来阅读和编写代码,那么理解C的基础也可能是你时间的一个很好的投资)。 / p>

您可以通过对底层设施进行适当的封装,为Python socket模块创建更加pythonic的替代品。但是,目前还不清楚它是否会起到任何有用的作用。套接字的大多数琐碎的用法都是通过少量略微不透明但通常足够的"复制/粘贴编程"大多数读者会大致了解代码中发生的事情;其他人参与其中足以让他们确实需要完全访问和了解基础设施。