-

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

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

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

什么是套接字?

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

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

插座有自己的词汇:

术语描述
用作传输机制的协议族。这些值是常量,例如AF_INET,PF_INET,PF_UNIX,PF_X25等。
类型两个端点之间的通信类型,通常用于面向连接的协议的SOCK_STREAM和用于无连接协议的SOCK_DGRAM。
协议通常为零,这可以用于标识域和类型中的协议的变体。
主机名网络接口的标识符:
  • 一个字符string,可以是一个主机名,一个点四分之一地址,或一个冒号中的IPV6地址(可能是点)符号
  • 一个字符string“<广播>”,它指定一个INADDR_BROADCAST地址。
  • 一个零长度的字符string,指定INADDR_ANY,或
  • 整数,以主机字节顺序解释为二进制地址。
港口每个服务器监听呼叫一个或多个端口的客户端。端口可能是Fixnum端口号,包含端口号的字符string或服务名称。

插座模块

要创建套接字,必须使用套接字模块中可用的socket.socket()函数,它具有一般的语法 -

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

这是参数的描述 -

一旦拥有套接字对象,就可以使用所需的功能来创建客户端或服务器程序。以下是所需功能的列表 -

服务器套接字方法

方法描述
s.bind() 此方法将地址(主机名,端口号对)绑定到套接字。
s.listen()此方法设置并启动TCP侦听器。
s.accept()这被动地接受TCP客户端连接,等待直到连接到达(阻塞)。

客户端套接字方法

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

通用套接字方法

方法描述
s.recv() 此方法接收TCP消息
s.send() 该方法传输TCP消息
s.recvfrom() 此方法接收UDP消息
s.sendto() 该方法发送UDP消息
s.close() 此方法关闭套接字
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.connect(hosname,端口)打开一个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互联网模块

Python网络/互联网编程中的一些重要模块的列表。

协议共同功能港口号Python模块
HTTP网页80httplib,urllib,xmlrpclib
NNTPUsenet新闻119nntplib
FTP文件传输20ftplib,urllib
SMTP发送电子邮件25smtplib
POP3获取电子邮件110poplib
IMAP4获取电子邮件143伊马替利
Telnet命令行23telnetlib
Gopher文档传输70gopherlib,urllib

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

进一步阅读

这是Socket编程的一个快速开始。这是一个广阔的话题。建议通过以下链接查找更多详细信息 -