📜  Python套接字编程

📅  最后修改于: 2020-11-06 06:30:08             🧑  作者: Mango


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

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

套接字是双向通信通道的端点。套接字可以在一个进程内,同一台机器上的进程之间或不同大陆上的进程之间进行通信。我们在Python使用套接字模块来创建和使用套接字。

套接字有自己的词汇表-

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/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,port)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

具有公开网址的套接字

在下面的示例中,我们使用套接字模块中的几种方法来查找服务器的地址信息和主机名详细信息。

import socket
from pprint import pprint

# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')

pprint(addrinfo)

# get server hostname
print socket.gethostname()

当我们运行上面的程序时,我们得到以下输出-

[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP