Python Network Programming 简明教程

Python - Sockets Programming

Python 提供 two 层对网络服务的访问权限。在较低层,您可以在底层操作系统中访问基本套接字支持,这允许您为面向连接和无连接协议实现客户端和服务器。

Python 还具有库,提供对特定应用程序级网络协议的更高级访问,例如 FTP、HTTP 等。

套接字是双向通信通道的端点。套接字可以在进程中、位于同一计算机上的进程之间或位于不同大陆上的进程之间通信。我们在 Python 中使用 socket 模块创建和使用套接字。

套接字具有自己的词汇:

Sr.No.

Term & Description

1

Domain 用作传输机制的协议族。这些值是常量,例如 AF_INET、PF_INET、PF_UNIX、PF_X25 等。

2

type 两个端点之间的通信类型,通常对于面向连接的协议使用 SOCK_STREAM,对于无连接的协议使用 SOCK_DGRAM。

3

protocol 通常为零,这可以在域和类型内标识协议的变体。

4

hostname 网络接口标识符 − 一个字符串,可以是主机名、点分十进制地址或冒号(可能还有点)表示法的 IPV6 地址一个指定 INADDR_BROADCAST 地址的字符串“<broadcast>”。一个空字符串,它指定 INADDR_ANY,或者一个整数,解释为主机字节顺序的二进制地址。

5

port 每个服务器监听客户端调用一个或多个端口。端口可以是 Fixnum 端口号、包含端口号的字符串或服务名。

The socket Module

要创建套接字,您必须使用 socket 模块中提供的 socket.socket() 函数,其一般语法为 −

s = socket.socket (socket_family, socket_type, protocol=0)

以下是参数说明 −

  1. socket_family − 这是 AF_UNIX 或 AF_INET,如前文所述。

  2. socket_type − 这是 SOCK_STREAM 或 SOCK_DGRAM。

  3. protocol − 通常省略,默认为 0。

一旦有了套接字对象,就可以使用所需函数创建您的客户端或服务器程序。

Server Socket Methods

Sr.No.

Method & Description

1

s.bind() 此方法将地址(主机名、端口号对)绑定到套接字。

2

s.listen() 此方法设置并启动 TCP 侦听器。

3

s.accept() 这被动接受 TCP 客户端连接,一直等到连接到达(阻塞)。

Client Socket Methods

Sr.No.

Method & Description

1

s.connect() 此方法主动启动 TCP 服务器连接。

General Socket Methods

Sr.No.

Method & Description

1

s.recv() 此方法接收 TCP 消息

2

s.send() 此方法传输 TCP 消息

3

s.recvfrom() 此方法接收 UDP 消息

4

s.sendto() 此方法传输 UDP 消息

5

s.close() This method closes socket

6

socket.gethostname() Returns the hostname.

A Simple Server

要编写 Internet 服务器,我们使用 socket 模块中提供的 socket 函数来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。

现在调用 bind(hostname, port) 函数,为在给定主机上的服务指定端口。

接下来,调用返回对象的 accept 方法。此方法会一直等待直到某个客户端连接到您指定的端口,然后返回表示对该客户端连接的连接对象。

#!/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

A Simple Client

让我们编写一个非常简单的客户端程序,它打开到给定端口 12345 及给定主机的连接。这非常简单,只需使用 Python 的套接字模块函数来创建一个套接字客户端。

socket.connect(hosname, 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

Socket with Public URL

在下面的示例中,我们使用了套接字模块中的几个方法来查找服务器和主机名的地址信息。

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