Python3网络编程


Python提供了对网络服务的两个访问级别。在较低的级别上,你可以访问底层操作系统中的基本套接字支持,从而可以为面向连接和无连接的协议实现客户端和服务器。

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

本章将使你对“网络-套接字编程”中最著名的概念有所了解。

什么是插座?


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

套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP,UDP等。这 socket 库提供了用于处理常见传输的特定类以及用于处理其余部分的通用接口。

套接字有自己的词汇:

序号 术语和描述
1

domain

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

2

type

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

3

protocol

通常为零,可用于标识域和类型内协议的变体。

4

hostname

网络接口的标识符:

  • 字符串,可以是主机名,点分四进制地址或IPV6地址(以冒号(可能是点)表示)

  • 字符串“ ”,它指定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。

  • 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 套接字模块中提供的用于创建套接字对象的函数。然后使用套接字对象调用其他函数来设置套接字服务器。

现在致电 绑定(主机名,端口) 指定一个功能 port 在给定主机上的服务。

接下来,致电 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 模块功能。

The socket.connect(hosname,port) 打开一个TCP连接到 hostname on the port 。打开套接字后,就可以像读取任何IO对象一样从中读取套接字。完成后,请记住将其关闭,就像关闭文件一样。

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

#!/usr/bin/python3           # This is client.py file

import socket

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

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

port = 9999

# connection to hostname on the port.
s.connect((host, port))                               

# Receive no more than 1024 bytes
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

现在,在后台运行此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网络/互联网编程中的一些重要模块:

Protocol 常用功能 Port No Python模块
HTTP 网页 80 httplib,urllib,xmlrpclib
NNTP Usenet新闻 119 nntplib
FTP 文件传输 20 ftplib,urllib
SMTP 发送邮件 25 smtplib
POP3 提取电子邮件 110 poplib
IMAP4 提取电子邮件 143 imaplib
Telnet 指令行 23 telnetlib
Gopher 文件转移 70 gopherlib,urllib

请检查上述所有库,以使用FTP,SMTP,POP和IMAP协议。

进一步阅读


这是套接字编程的快速入门。这是一个广阔的主题。建议通过以下链接查找更多详细信息:

  • Unix套接字编程 .

  • Python套接字库和模块 .