Python - 网络编程

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

Python也有库提供对特定应用程序级网络协议(如FTP,HTTP等)的更高级别访问.

本章让您了解网络中最着名的概念 - 套接字编程.

什么是套接字?

套接字是双向通信通道的端点.套接字可以在进程内,同一台机器上的进程之间或不同大洲的进程之间进行通信.

套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP, UDP,依此类推. socket 库提供了用于处理公共传输的特定类以及用于处理其余传输的通用接口.

套接字有自己的词汇 :

Sr.No.Term&说明
1

Domain

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

2

type

两个端点之间的通信类型,通常是SOCK_STREAM用于连接面向无连接协议的协议和SOCK_DGRAM.

3

protocol

通常为零,这可用于识别域内协议的变体并输入.

4

hostname

网络接口的标识符 :

  • 一个字符串,可以是主机名,点分四位地址或冒号(可能是点)表示法中的IPV6地址

  • 字符串" < broadcast>",指定INADDR_BROADCAST地址.

  • 零长度字符串,指定INADDR_ANY或

  • 一个整数,按主机字节顺序解释为二进制地址.

5

port

每个服务器侦听在一个或多个端口上调用的客户端.端口可以是Fixnum端口号,包含端口号的字符串或服务名称.

套接字模块

要创建套接字,必须使用 socket.socket()函数. i> socket 模块,它具有通用语法 :

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

以下是参数说明 :

  • socket_family : 这是AF_UNIX或AF_INET,如前所述.

  • socket_type : 这是SOCK_STREAM或SOCK_DGRAM.

  • 协议 : 这通常被省略,默认为0.

一旦你有 socket 对象,那么你可以使用创建客户端或服务器程序所需的功能.以下是所需的函数列表 :

服务器套接字方法

Sr.No.Method&说明
1

s.bind()

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

2

s.listen()

此方法设置并启动TCP侦听器.

3

s.accept()

这被动接受TCP客户端连接,等待连接到达(阻止).

客户端套接字方法

Sr.No.方法&说明
1

s.connect()

此方法主动启动TCP服务器连接.

常规套接字方法

Sr.No.Method&说明
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 方法.此方法等待客户端连接到您指定的端口,然后返回表示与该客户端的连接的连接对象.

#!/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)打开端口上与主机名的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

Python Internet模块

Python网络/Internet编程中一些重要模块的列表.

Protocol常用功能端口号Python模块
HTTP网页80httplib,urllib,xmlrpclib
NNTPUsenet news119nntplib
FTP文件传输20ftplib,urllib
SMTP发送电子邮件25smtplib
POP3提取电子邮件110poplib
IMAP4提取电子邮件143imaplib
Telnet命令行23telnetlib
Gopher文件传输70gopherlib,urllib

请检查上面提到的所有库以使用FTP,SMTP,POP和IMAP协议.

进一步阅读

下面是Socket Programming的一个快速入门。 这是一个广泛的主题。 建议通过以下链接查找更多详细信息:

  • Unix Socket Programming.

  • Python Socket Library and Modules.