创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
这个语句不是该语句不是自己创建了该实例化对象了吗?那么再进行调用,为什么不是通过创建的对象进行调用?还是说socket属于静态方法?

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
这个语句不是该语句不是自己创建了该实例化对象了吗?那么再进行调用,为什么不是通过创建的对象进行调用?还是说socket属于静态方法?

关注引自免费微信小程序:皆我百晓生
在Python中,socket是一个内置模块,用于处理网络通信。它提供了创建和管理套接字(sockets)的方法。当您导入socket模块并想要创建一个新的套接字时,确实会实例化一个套接字对象。但是,获取主机名的操作与套接字实例无关,它是对系统主机名的查询,这通常在创建套接字之前完成。
获取主机名的函数 gethostname() 是在 socket 模块级别定义的一个静态方法,而不是在套接字对象上的一个实例方法。这意味着你不需要通过一个具体的套接字实例来调用它,而是可以直接在 socket 模块上调用。这是因为获取主机名这一操作与特定的网络连接或套接字无关,它只是用来标识运行程序的计算机。
下面是修改后的代码,删除了不必要的注释,并且更正了一些缩进错误,使其更具可读性:
#!/usr/bin/python3
# 文件名:client.py
# 导入 socket 和 sys 模块
import socket
import sys
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接到服务,指定主机和端口
s.connect((host, port))
# 接收小于1024字节的数据
msg = s.recv(1024)
# 关闭连接
s.close()
# 打印收到的消息
print(msg.decode('utf-8'))
在这个例子中,socket.gethostname() 是从 socket 模块中直接调用的,因为获取主机名并不是针对某个特定的套接字操作,而是在整个程序开始时确定主机信息的一个通用步骤。因此,它无需通过套接字实例来执行。