Python Socket程序
Python提供了对网络服务的两个访问级别。在较低的级别上,可以访问底层操作系统中的基本套接字支持,从而可以为面向连接和无连接的协议实现客户端和服务器。
Python还具有提供对特定应用程序级网络协议(例如FTP,HTTP等)的更高级别访问的库。
套接字是双向通信通道的端点。套接字可以在一个进程内,同一台机器上的进程之间或不同大陆上的进程之间进行通信。在python中使用套接字模块来创建和使用套接字。
套接字有自己的词汇表 :
编号 | 术语 | 描述 |
1 | Domain | 用作传输机制的协议系列。这些值是常量,例如:AF_INET,PF_INET,PF_UNIX,PF_X25等。 |
2 | type | 两个端点之间的通信类型,通常是面向连接协议的SOCK_STREAM和无连接协议的SOCK_DGRAM。 |
3 | protocol | 通常为零,可用于标识域和类型内协议的变体。 |
4 | hostname | 网络接口的标识符 |
5 | port | 每台服务器侦听在一个或多个端口上调用的客户端。端口可以是Fixnum端口号,包含端口号的字符串或服务名称。 |
Socket模块
要创建套接字,必须使用套接字模块中可用的socket.socket()函数,该函数具有以下常规语法:
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
s = socket.socket (socket_family, socket_type, protocol=0)
这是参数的描述:
- socket_family - 如前所述,它是AF_UNIX或AF_INET。
- socket_type - 它是SOCK_STREAM或SOCK_DGRAM。
- protocol - 通常忽略,默认为0。
一旦有了套接字对象,就可以使用所需的函数来创建客户端或服务器程序。
服务器套接字方法
编号 | 方法 | 描述 |
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服务器,我们使用套接字模块中可用的套接字函数来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用bind(hostname,port)函数为给定主机上的服务指定一个端口。接下来,调用返回对象的accept方法。此方法将一直等到客户端连接到您指定的端口,然后返回表示该客户端连接的连接对象。
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
#!/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.connect(hosname,port)在端口上打开到主机名的TCP连接。打开套接字后,可以像读取任何IO对象一样从中读取套接字。完成后,记得关闭它,就像关闭文件一样。
以下代码是一个非常简单的客户端,该客户端连接到给定的主机和端口,从套接字读取任何可用数据,然后退出:
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
#!/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上方运行以查看结果。
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
# Following would start a server in background.
$ python server.py &
# Once server is started run client as follows:
$ python client.py
将产生以下结果 :
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
公开网址的套接字
在下面的示例中,使用套接字模块中的几种方法来查找服务器的地址信息和主机名详细信息。
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('codebaoku.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()
执行上面示例代码,得到以下结果:
# Filename : example.py
# Copyright : 2020 By Codebaoku
# Author by : www.codebaoku.com
# Date : 2020-08-25
[( , , 17,'',('59.110.239.6', 80)),
( , , 6, '', ('59.110.239.6', 80))]
在http协议中,来自客户端的请求到达服务器,并假定它是有效请求,并获取一些数据和元数据。可以使用python请求模块中提供的各种功能来分析服务器的响应。下面的python程序在客户端运行,并显示服务器发送的响 ...