📜  Python 3-网络编程

📅  最后修改于: 2020-12-23 05:03:16             🧑  作者: Mango


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

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

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

什么是插座?

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

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

套接字有自己的词汇表-

Sr.No. Term & Description
1

domain

The family of protocols that is used as the transport mechanism. These values are constants such as AF_INET, PF_INET, PF_UNIX, PF_X25, and so on.

2

type

The type of communications between the two endpoints, typically SOCK_STREAM for connection-oriented protocols and SOCK_DGRAM for connectionless protocols.

3

protocol

Typically zero, this may be used to identify a variant of a protocol within a domain and type.

4

hostname

The identifier of a network interface −

  • A string, which can be a host name, a dotted-quad address, or an IPV6 address in colon (and possibly dot) notation

  • A string “”, which specifies an INADDR_BROADCAST address.

  • A zero-length string, which specifies INADDR_ANY, or

  • An Integer, interpreted as a binary address in host byte order.

5

port

Each server listens for clients calling on one or more ports. A port may be a Fixnum port number, a string containing a port number, or the name of a service.

插座模块

要创建套接字,必须使用套接字模块中可用的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。

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

服务器套接字方法

Sr.No. Method & Description
1

s.bind()

This method binds address (hostname, port number pair) to socket.

2

s.listen()

This method sets up and start TCP listener.

3

s.accept()

This passively accept TCP client connection, waiting until connection arrives (blocking).

客户端套接字方法

Sr.No. Method & Description
1

s.connect()

This method actively initiates TCP server connection.

通用套接字方法

Sr.No. Method & Description
1

s.recv()

This method receives TCP message

2

s.send()

This method transmits TCP message

3

s.recvfrom()

This method receives UDP message

4

s.sendto()

This method transmits UDP message

5

s.close()

This method closes socket

6

socket.gethostname()

Returns the hostname.

一个简单的服务器

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

现在调用bind(hostname,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.connect(hosname,port)port上打开到主机名的TCP连接。打开套接字后,就可以像读取任何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 Common function Port No Python module
HTTP Web pages 80 httplib, urllib, xmlrpclib
NNTP Usenet news 119 nntplib
FTP File transfers 20 ftplib, urllib
SMTP Sending email 25 smtplib
POP3 Fetching email 110 poplib
IMAP4 Fetching email 143 imaplib
Telnet Command lines 23 telnetlib
Gopher Document transfers 70 gopherlib, urllib

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

进一步阅读

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