- Python - 网络编程
- Python - 网络入门
- Python - 网络环境
- Python - 互联网协议
- Python - IP 地址
- Python - DNS 查询
- Python - 路由
- Python - HTTP 请求
- Python - HTTP 响应
- Python - HTTP 头部
- Python - 自定义 HTTP 请求
- Python - 请求状态码
- Python - HTTP 认证
- Python - HTTP 数据下载
- Python - 连接重用
- Python - 网络接口
- Python - 套接字编程
- Python - HTTP 客户端
- Python - HTTP 服务器
- Python - 构建 URL
- Python - Web 表单提交
- Python - 数据库和 SQL
- Python - Telnet
- Python - 电子邮件
- Python - SMTP
- Python - POP3
- Python - IMAP
- Python - SSH
- Python - FTP
- Python - SFTP
- Python - Web 服务器
- Python - 上传数据
- Python - 代理服务器
- Python - 目录列表
- Python - 远程过程调用
- Python - RPC JSON 服务器
- Python - 谷歌地图
- Python - RSS Feed
Python - 套接字编程
Python 提供了两个级别的网络服务访问。在低级别,您可以访问底层操作系统的基本套接字支持,这使您可以为面向连接和无连接协议实现客户端和服务器。
Python 还具有提供对特定应用程序级网络协议(例如 FTP、HTTP 等)的更高级别访问的库。
套接字是双向通信通道的端点。套接字可以在进程内、同一台机器上的进程之间或不同大陆上的进程之间进行通信。我们使用 Python 中的 socket 模块来创建和使用套接字。
套接字有自己的词汇表 -
序号 | 术语及描述 |
---|---|
1 | 域 用作传输机制的协议族。这些值是常量,例如 AF_INET、PF_INET、PF_UNIX、PF_X25 等。 |
2 | 类型 两个端点之间通信的类型,通常对于面向连接的协议为 SOCK_STREAM,对于无连接的协议为 SOCK_DGRAM。 |
3 | 协议 通常为零,这可用于识别域和类型内协议的变体。 |
4 | 主机名 网络接口的标识符 -
|
5 | 端口 每个服务器都在一个或多个端口上侦听客户端的调用。端口可以是 Fixnum 端口号、包含端口号的字符串或服务的名称。 |
socket 模块
要创建套接字,必须使用 socket 模块中提供的 socket.socket() 函数,其通用语法如下 -
s = socket.socket (socket_family, socket_type, protocol=0)
以下是参数的描述 -
socket_family - 这是 AF_UNIX 或 AF_INET,如前所述。
socket_type - 这是 SOCK_STREAM 或 SOCK_DGRAM。
protocol - 通常省略,默认为 0。
拥有 socket 对象后,就可以使用所需函数创建客户端或服务器程序。
服务器套接字方法
序号 | 方法及描述 |
---|---|
1 | s.bind() 此方法将地址(主机名、端口号对)绑定到套接字。 |
2 | s.listen() 此方法设置并启动 TCP 侦听器。 |
3 | s.accept() 此方法被动接受 TCP 客户端连接,等待连接到达(阻塞)。 |
客户端套接字方法
序号 | 方法及描述 |
---|---|
1 | s.connect() 此方法主动启动 TCP 服务器连接。 |
通用套接字方法
序号 | 方法及描述 |
---|---|
1 | s.recv() 此方法接收 TCP 消息 |
2 | s.send() 此方法传输 TCP 消息 |
3 | s.recvfrom() 此方法接收 UDP 消息 |
4 | s.sendto() 此方法传输 UDP 消息 |
5 | s.close() 此方法关闭套接字 |
6 | socket.gethostname() 返回主机名。 |
一个简单的服务器
要编写 Internet 服务器,我们使用 socket 模块中提供的 socket 函数来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用 bind(hostname, port) 函数为给定主机上的服务指定一个 port。
接下来,调用返回对象的 accept 方法。此方法等待客户端连接到您指定的端口,然后返回一个 connection 对象,该对象表示与该客户端的连接。
#!/usr/bin/python # This is server.py file import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 12345 # Reserve a port for your service. s.bind((host, port)) # Bind to the port s.listen(5) # Now wait for client connection. while True: c, addr = s.accept() # Establish connection with client. print 'Got connection from', addr c.send('Thank you for connecting') c.close() # Close the connection
一个简单的客户端
让我们编写一个非常简单的客户端程序,该程序打开到给定端口 12345 和给定主机的连接。使用 Python 的 socket 模块函数创建套接字客户端非常简单。
socket.connect(hosname, port ) 打开到 hostname 上 port 的 TCP 连接。打开套接字后,您可以像任何 IO 对象一样从中读取。完成后,请记住关闭它,就像关闭文件一样。
以下代码是一个非常简单的客户端,它连接到给定主机和端口,从套接字读取任何可用数据,然后退出 -
#!/usr/bin/python # This is client.py file import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 12345 # Reserve a port for your service. s.connect((host, port)) print s.recv(1024) s.close # Close the socket when done
现在在后台运行此 server.py,然后运行上面的 client.py 以查看结果。
# Following would start a server in background. $ python server.py & # Once server is started run client as follows: $ python client.py
这将产生以下结果 -
Got connection from ('127.0.0.1', 48437) Thank you for connecting
带有公共 URL 的套接字
在下面的示例中,我们使用 socket 模块中的几个方法来查找服务器的地址信息和主机名详细信息。
import socket from pprint import pprint # get server address addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www') pprint(addrinfo) # get server hostname print socket.gethostname()
当我们运行上述程序时,我们得到以下输出 -
[(2, 1, 0, '', ('94.130.81.180', 80))] DESKTOP-JXYKQCPLP