Python 3 - 网络编程

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()函数语法和减号;

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(主机名,端口)函数来指定端口用于给定主机上的服务.

接下来,调用返回对象的 accept 方法.此方法等待客户端连接到您指定的端口,然后返回表示与该客户端的连接的连接对象.

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

一个简单的客户端

让我们编写一个非常简单的客户端程序,打开与给定端口12345和给定主机的连接.使用Python的 socket 模块函数创建套接字客户端非常简单.

socket.connect(hosname,port)端口上打开与主机名的TCP连接.打开套接字后,可以像任何IO对象一样从中读取.完成后,请记得关闭它,就像关闭文件一样.

示例

以下代码是一个连接到a的非常简单的客户端给定主机和端口,从套接字读取任何可用数据,然后退出和减去;

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

现在在后台运行此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

输出

这将产生以下结果 :

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting

Python Internet模块

Python网络/互联网编程中一些重要模块的列表在下面和下面给出;

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

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

进一步读数

这是套接字编程的快速入门.这是一个广泛的主题.建议通过以下链接查找更多详细信息和减号;

  • Unix Socket编程.

  • Python套接字库和模块.