龙空技术网

Python网络编程基础

slevnling 245

前言:

当前你们对“python套接字”大体比较注重,兄弟们都需要知道一些“python套接字”的相关文章。那么小编同时在网上网罗了一些有关“python套接字””的相关文章,希望小伙伴们能喜欢,咱们一起来了解一下吧!

Python网络编程Socket库

套接字(socket)

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。套接字是socket的通常叫法,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。Python中Socket库为操作系统的socket实现提供了一个Python接口。

1.socket协议类型

socket库中整合了多种协议类型

socket协议类型

描述

socket.AF_UNIX

用于同一台机器上的进程通信(本地通信)

socket.AF_INET

用于服务器与服务器之间的网络通信

socket.AF_INET6

基于IPV6方式的服务器与服务器之间的网络通信

socket.SOCK_STREAM

基于TCP的流式socket通信

socket.SOCK_DGRAM

基于UDP的数据报式socket通信

socket.SOCK_RAW

原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次SOCK_RAW也可以处理特殊的IPV4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头

socket.SOCK_SEQPACKET

可靠的连续数据包服务

2.socket函数

服务器端Socket函数:socket库中的服务器端函数仅供服务器使用

语法格式

描述

socket.bind(address)

将套接字绑定到地址,在AF_INET协议下,以tuple(host,port)的方式传入,如socket.bind((host,port)),其中host为绑定的地址,port为监听的端口

socket.listen(backlog)

开始监听TCP传入连接,backlog指定在拒绝链接前,操作系统可以挂起的最大连接数,该值最少为1,大部分应用程序通常设为5

socket.accept()

接受TCP链接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据,address是链接客户端的地址

客户端Socket函数:socket库中的客户端函数仅供客户端使用

语法格式

描述

socket.connect(address)

连接到address处的套接字,一般address的格式为tuple(host,port),若连接出错,则返回socket.error错误

socket.connect_ex(address)

功能与socket.connect相同,但成功返回0,失败返回error的值

公共Socket函数:socket库中的公共函数即可在服务器端使用也可在客户端使用,为通用函数

语法格式

描述

socket.recv(buffsize[,flag])

接受TCP套接字的数据,数据以字符串形式返回,buffsize指定要接受的最大数据量,flag提供有关消息的其他信息,通常可以忽略

socket.send(string[,flag])

发送TCP数据,将字符串中的数据发送到链接的套接字,返回值是要发送的字节数量,该数量可能小于string的字节大小

socket.sendall(string[,flag])

完整发送TCP数据,将字符串中的数据发送到链接的套接字,但在返回之前尝试发送所有数据。成功返回None,失败则抛出异常

socket.recvfrom(bufsize[,flag])

接受UDP套接字的数据,与recv函数类似,但返回值是tuple(data,address)。其中data是包含接受数据的字符串,address是发送数据的套接字地址

socket.sendto(string[,flag],address)

发送UDP数据,将数据发送到套接字,address形式为tuple(ipaddr,port),指定远程地址发送,返回值是发送的字节数

socket.close()

关闭套接字

socket.getpeername()

返回套接字的远程地址,返回值通常是一个tuple(ipaddr,port)

socket.getsockname()

返回套接字自己的地址,返回值通常是一个tuple(ipaddr,port)

socket.setsockopt(level,optname,value)

设置给定套接字选项的值

socket.getsockopt(level,optname[,buflen])

返回套接字选项的值

socket.settimeout(timeout)

设置套接字操作的超时时间,timeout是一个浮点数,单位是秒,值为None时表示永远不会超时。超时时间应在刚创建套接字时设置,因为它们可能用于连接的操作,如s.connect()

socket.gettimeout()

返回当前超时值,单位是秒,如果没有设置超时则返回None

socket.fileno()

返回套接字的文件描述

socket.makefile()

创建一个与该套接字相关的文件

使用Socket进行TCP编程

TCP连接由客户端发起,服务器对连接进行响应

建立一个服务器,服务器进程需要绑定一个端口并监听来自其他客户端的连接。若有客户端发起连接请求,服务器就与该客户端建立Socket连接,随后的通信就通过此Socket连接进行。服务器依赖服务器地址,服务器端口,客户端地址,客户端端口这4项来唯一确定一个Socket连接。

一、服务器端TCP连接

建立服务器端的TCP连接,具体步骤如下:

1.在Python中创建一个基于IPv4和TCP协议的Socket

# 导入socket库及依赖库import socketimport threadingimport time# 建立TCP连接的Sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2.绑定监听的地址和端口,地址使用本机地址“127.0.0.1”或“local host”,使用大于1024的端口

# 绑定地址及监听端口s.bind(('127.0.0.1', 6666))

3.调用listen方法开始监听端口,传入的参数指定等待连接的最大数量,设定为5(可以随意设置,建议不要太大)

# 调用listen方法监听端口s.listen(5)print('Wait for connection...')

4.创建一个tcp函数,该函数在连接建立后,服务器端首先发出一条表示连接成功的消息,然后等待客户端数据,再加上欢迎信息发送给客户端。若客户端发送exit字符串,则直接关闭连接

# 服务器端应答函数:def tcp(sock, addr):    print('Accept new connection from %s:%s...' % addr)    sock.send(b'Success!')    while True:        data = sock.recv(1024)        time.sleep(1)        if not data or data.decode('utf-8') == 'exit':            break        sock.send(('Welcom! %s!' % data.decode('utf-8')).encode('utf-8'))    sock.close()print('Connection from %s:%s closed.' % addr)

5.通过一个循环接受来自客户端的连接,使用accept函数等待并返回一个客户端的连接,每个连接都分配一个新线程来处理

# 循环处理客户端连接while True:    # 接受来自客户端的新连接:    sock, addr = s.accept()# 创建新线程来处理TCP连接:    t = threading.Thread(target=tcp args=(sock, addr))    t.start()

二、客户端TCP连接

在服务器端TCP连接建立后,建立客户端TCP连接进行测试,具体步骤如下:

1.与服务器端的协议保持一致,也建立一个基于IPv4和TCP协议的Socket

# 导入socket库import socket# 建立TCP连接s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2.与服务器端建立连接,连接的地址与端口需与服务器端保持一致

# 与服务器建立连接s.connect(('127.0.0.1', 6666))

3.使用recv函数接受服务器提示信息,之后再使用send函数发送数据至服务器,可看到服务器返回的结果

# 接受服务器的连接成功提示信息print(s.recv(1024).decode('utf-8'))# 发送数据并接受服务器返回结果for data in [b'Tom', b'Jerry', b'Spike']:		s.send(data)		print(s.recv(1024).decode('utf-8'))# 发送退出信息断开连接s.send(b'exit')s.close()
使用Socket进行UDP编程

TCP建立的连接可靠,通信双方以流的形式互相传送数据。相对TCP协议,UDP则是面向无连接的协议

使用UDP协议时,无需建立连接的过程,仅需知道对方的IP地址及端口号,便可直接发送数据包,但无法保证能顺利传达到虽然用UDP传输数据不可靠,但其传输速度比TCP快,对于不要求可靠到达的数据,就可以使用UDP协议UDP传输通常应用在通讯实时性要求更高于可靠性场景,例如网络游戏

使用Socket进行UDP编程

一、服务器端UDP连接

UDP连接与TCP连接类似,也分为服务器端和客户端,不同的是UDP连接无需调用listen方法,直接接受来自任何客户端的数据。

1.建立UDP连接,服务器端同样需要绑定地址与端口

# 导入socket库import socket# 建立UDP连接s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址与端口s.bind(('127.0.0.1', 6666))print('set UDP on 6666...')

2.使用recvfrom方法返回数据及客户端的地址与端口,当服务器收到数据后,直接调用sendto把数据用UDP发给客户端

while True:		# 接收来自任意客户端的数据:		data, addr = s.recvfrom(1024)		# 打印接受信息并回传欢迎信息		print('Received from %s:%s.' % addr)		s.sendto(b'Welcom! %s!' % data, addr)

二、客户端UDP连接

1.客户端使用UDP连接时同样需要先创建socket

# 导入socket库import socket# 建立UDP连接s = socket.socket(socket.AF_INET, socket. SOCK_DGRAM)

2.之后无需使用connect方法,直接用sendto方法发送数据至服务器建立UDP连接,服务器端同样需要绑定地址与端口

# 发送数据并接受服务器回传数据for data in [b'Tom', b'Jerry', b'Spike']:		s.sendto(data, ('127.0.0.1', 99996666))		print(s.recv(1024).decode('utf-8'))s.close()

3.UDP连接与TCP连接可同时使用同一端口互不冲突,两者使用的端口是独立绑定的

小结

本文主要介绍了Python中的底层Socket库,及运用socket库建立TCP和UDP连接。

1.Socket库提供多种协议类型和函数,可用于建立TCP和UDP连接。

2.HTTP协议基于TCP协议进行客户端与服务器间的通讯,由客户端发起请求,服务器进行应答。

标签: #python套接字