套接字是双向通信信道的端点.它们可以在进程内,同一台机器上的进程之间或不同机器上的进程之间进行通信.类似地,网络套接字是在诸如因特网之类的计算机网络上运行的两个程序之间的通信流中的一个端点.它纯粹是虚拟的东西,并不代表任何硬件.网络套接字可以通过IP地址和端口号的唯一组合来识别.网络套接字可以通过许多不同的通道类型实现,如TCP,UDP等.
与网络编程中使用的套接字相关的不同术语如下 :
域
域是用作传输机制的协议族.这些值是常量,如AF_INET,PF_INET,PF_UNIX,PF_X25等.
类型
类型表示两个端点之间的通信类型,通常SOCK_STREAM用于面向连接的协议,SOCK_DGRAM用于无连接协议.
协议
这可用于识别协议中的协议变体域名和类型.它的默认值为0.通常省略.
主机名
这用作网络接口的标识符.主机名可以是字符串,虚线四元组地址或冒号(可能是点)表示法的IPV6地址.
端口
每个服务器侦听在一个或多个端口上调用的客户端.端口可以是Fixnum端口号,包含端口号的字符串,或服务名称.
用于套接字编程的Python套接字模块
要在python中实现套接字编程,我们需要使用Socket模块.以下是创建Socket : 的简单语法;
import socket s = socket.socket(socket_family,socket_type,protocol = 0 )
这里,我们需要导入套接字库,然后创建一个简单的套接字.以下是使用socket : 时使用的不同参数;
socket_family : 这是AF_UNIX或AF_INET,如前所述.
socket_type : 这是SOCK_STREAM或SOCK_DGRAM.
协议 : 这通常被省略,默认为0.
套接字方法
在本节中,我们将了解不同的套接字方法.下面描述了三种不同的套接字方法 :
服务器套接字方法
客户端套接字方法
常规套接字方法
服务器套接字方法
In在客户端 - 服务器架构中,有一个集中服务器提供服务,许多客户端从该集中式服务器接收服务.客户端也向服务器发出请求.此体系结构中的一些重要的服务器套接字方法如下 :
socket.bind() : 此方法将地址(主机名,端口号)绑定到套接字.
socket.listen() : 该方法基本上监听与套接字的连接.它启动TCP侦听器. Backlog是此方法的参数,它指定排队连接的最大数量.它的最小值为0,最大值为5.
socket.accept() : 这将接受TCP客户端连接.对(conn,address)是此方法的返回值对.这里,conn是一个新的套接字对象,用于在连接上发送和接收数据,地址是绑定到套接字的地址.在使用此方法之前,必须使用socket.bind()和socket.listen()方法.
客户端套接字方法
客户端 - 服务器体系结构中的客户端请求服务器并从服务器接收服务.为此,只有一种专用于客户的方法 :
socket.connect(地址) : 这种方法主动亲密的服务器连接或简单地说这种方法将客户端连接到服务器.参数地址表示服务器的地址.
常规套接字方法
除客户端之外和服务器套接字方法,有一些通用的套接字方法,这在套接字编程中非常有用.一般套接字方法如下 :
socket.recv(bufsize) : 顾名思义,此方法从套接字接收TCP消息.参数bufsize代表缓冲区大小,并定义此方法在任何时候都可以接收的最大数据.
socket.send(bytes) : 此方法用于将数据发送到连接到远程计算机的套接字.参数bytes将给出发送到套接字的字节数.
socket.recvfrom(数据,地址) : 此方法从套接字接收数据.此方法返回两对(数据,地址)值.数据定义接收的数据,地址指定发送数据的套接字的地址.
socket.sendto(数据,地址) : ;顾名思义,此方法用于从套接字发送数据.此方法返回两对(数据,地址)值.数据定义发送的字节数,地址指定远程机器的地址.
socket.close() : 此方法将关闭套接字.
socket.gethostname() : 此方法将返回主机的名称.
socket.sendall(data) : 此方法将所有数据发送到连接到远程计算机的套接字.它将不小心传输数据,直到发生错误,如果发生,则使用socket.close()方法关闭套接字.
计划在服务器和服务器之间建立连接;客户端
要在服务器和客户端之间建立连接,我们需要编写两个不同的Python程序,一个用于服务器,另一个用于客户端.
服务器端程序
在这个服务器端套接字程序中,我们将使用 socket.bind()方法将它绑定到特定的IP地址和端口,以便它可以侦听该IP和端口上的传入请求.稍后,我们使用 socket.listen()方法将服务器置于监听模式.数字(例如4)作为 socket.listen()方法的参数意味着如果服务器忙,则4个连接保持等待,如果第5个套接字尝试连接,则拒绝连接.我们将使用 socket.send()方法向客户端发送消息.接下来,我们使用 socket.accept()和 socket.close()方法分别启动和关闭连接.以下是服务器端程序 :
import socketdef Main(): host = socket.gethostname() port = 12345 serversocket = socket.socket() serversocket.bind((host,port)) serversocket.listen(1) print('socket is listening') while True: conn,addr = serversocket.accept() print("Got connection from %s" % str(addr)) msg = 'Connecting Established'+ "\r\n" conn.send(msg.encode('ascii')) conn.close()if __name__ == '__main__': Main()
客户端程序
在客户端socket程序,我们需要创建一个socket对象.然后我们将连接到运行我们服务器的端口 - 在我们的示例中为12345.之后,我们将使用 socket.connect()方法建立连接.然后,通过使用 socket.recv()方法,客户端将从服务器接收消息.最后, socket.close()方法将关闭客户端.
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)host = socket.gethostname()port = 12345s.connect((host, port))msg = s.recv(1024)s.close()print (msg.decode('ascii'))
现在,在运行服务器端程序后,我们将在终端上获得以下输出 :
socket is listeningGot connection from ('192.168.43.75', 49904)
运行客户端程序后,我们将获得跟随其他终端的输出 :
Connection Established
处理网络套接字异常
有两个块,即尝试和,除了,可用于处理网络套接字异常.以下是用于处理异常和减号的Python脚本;
import sockethost = "192.168.43.75"port = 12345s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try: s.bind((host,port)) s.settimeout(3) data, addr = s.recvfrom(1024) print ("recevied from ",addr) print ("obtained ", data) s.close()except socket.timeout : print ("No connection between client and server") s.close()
输出
上述程序生成以下输出 :
客户端和服务器之间没有连接
在上面的脚本中,我们首先创建了一个套接字对象.然后提供运行我们服务器的主机IP地址和端口号 - 在我们的示例中为12345.稍后,使用try块并在其中使用 socket.bind()方法,我们将尝试绑定IP地址和端口.我们使用 socket.settimeout()方法设置客户端的等待时间,在我们的示例中,我们设置为3秒.如果在服务器和客户端之间不建立连接,则使用except块来打印消息.