文章目录
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 。

第1关:创建连接套接字
任务描述
本关任务:建立一个通信的服务器端, 当一个客户端连接服务器时,在该服务器端创建一个连接套接字,接受客户端传输过来的信息,并打印出客户端的消息。
相关知识
为了完成本关任务,你需要掌握创建套接字时需要进行的步骤:
创建socket对象;
- 端口绑定;
- 端口监听;
- 建立连接;
- 接收客户端消息的函数;
- Socket 中使用的二进制转换函数。
创建socket对象
创建socket对象是第一步,后续所有的操作都是通过socket对象完成的。
创建对象使用socket()函数:
s=socket(参数1,参数2) #s就是创建的socket对象
参数1通常为:
AF_INET:面向网络
AF_UNIX:面向文件
参数2通常为:
SOCK_STREAM:面向连接的 TCP 套接字
SOCK_DGRAM:面向 UDP 的无连接套接字
端口绑定
服务器绑定了某一个端口,客户端才能通过该端口向服务器发起连接请求。如果不绑定端口,而是由系统随机分配给服务器一个端口,既然是随机的,那么客户端也不知道系统分配的是哪个端口进而无法与服务器通信。
有效的端口号范围为0~65535(小于1024的端口号预留给了系统)
使用bind(address)函数将套接字绑定到地址, 在 AF_INET 下,以元组host, port的形式表示address,即bind(host, port),其中host为服务器的地址,port为你需要绑定的端口号。host可以通过设为空值来表示任何在该服务器中可用的地址,即bind('',端口号)。
bind()函数封装在socket对象之中。
端口监听
服务器端还需要对端口进行监听,当有客户端从某个特定的端口号发送请求时,服务器要及时"听到",并进行处理。
端口监听采用listen(backlog)函数,backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
listen()函数封装在socket对象之中。
建立连接
当服务器端收到来自客户端的请求时,就可以与客户端建立连接了,使用socket对象中的accept()函数,表示接受连接并返回一个元组(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据,address是连接客户端的地址。
示例:
a,b = f() #则a和b是函数f()返回的元组。
接收客户端消息的函数
我们使用socket对象中的recv(bufsize)函数,表示接受 TCP 套接字的数据。数据以二进制串的形式返回,bufsize指定要接收的最大数据量。
提示:本知识点中,使用的socket对象是指建立连接后返回的conn对象。
Socket 中使用的二进制转换函数
由于接收的是二进制我们使用decode()函数进行解码,从二进制还原成字符串。
示例:
a = b'\xd1\xd0\xc1\xc0' #a是bytes类型对象
a.decode() #对a进行二进制解码
编程要求
本实训使用python3版本进行编程,采用面向网络的 TCP 连接,你需要在右侧编辑器补充代码,完成在服务器端创建一个连接套接字,接受客户端传输过来的信息,并打印出客户端的消息,具体要求如下:
绑定的端口号为6789。
本 Web 服务器仅能处理一个请求,即监听客户端是个数为1。
py
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM) #此步已经完成socket对象的创建,无需重新创建
serverSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
#********* Begin *********#
# 将TCP套接字绑定到指定端口
serverSocket.bind(('', 6789))
#********* End *********#
#********* Begin *********#
# 进行端口监听,客户端最大连接数为1
serverSocket.listen(1)
#********* End *********#
print("start...")
#********* Begin *********#
# 服务器端和客户端建立连接
connectionSocket, addr = serverSocket.accept()
#********* End *********#
print("连接成功")
#********* Begin *********#
# 得到客户端的数据,并打印出来
sentence = connectionSocket.recv(1024).decode()
print(sentence)
# 关闭本次客户端连接(可选,但推荐)
connectionSocket.close()
#********* End *********#
serverSocket.close()

第2关:socket传输加密图片※
任务描述
本关任务:在第一关的基础上进行增强,完成一次完整的会话过程,过程如下:
- 客户端发起请求,获取图片。
- 服务端获取客户端传输过来请求。
- 对图片进行RSA加密
- 客户端获取图片后,解密并保存此文件。
字符编码
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。
文本总是 Unicode,由 str 类型表示。
二进制数据则由 bytes 类型表示。
byte与str
在什么情况使用何种数据,需要明确的区分开来,在使用之前,先明白什么是bytes, 什么是unicode。
bytes是一种比特流,它的存在形式是01010001110这种,计算机能存储的唯一东西就是 bytes,但是我们无论是在写代码,还是阅读文章的过程中,肯定不会有人直接阅读这种比特流。它必须有一个编码方式,使得它变成方便人理解的比特流这就是文本。为了让这两者之间方便转换,科学家们定义了各种转换方式,把一个字符用一个二进制这就是编码。
str是由人们规定的一种表示方式,将二进制信息进行编码后转成我们人类可以识别的形式,因此一个str类型的文本,都包含一个隐含信息,就是编码格式。目前针对不同的文件,有不同的编码方式,比如:用 MP3, WAV 等对音乐进行编码;用 PNG, JPEG 等对图片进行编码;用 ASCII, UTF-8 等对文本其编码。
Python处理方法
在 Python 中处理的示范如下:
python
>>> str1 = '学无定法而有方法' # 正常字符串,已经编码。
>>> str1
'学无定法而有方法'
>>> type(str1) # 类型为str
<class 'str'>
>>> b1 = bytes(str1, encoding='utf-8') # 就字符串进行解码,告诉机器此字符串编码采用的是utf-8
>>> b1
b'\xe5\xad\xa6\xe6\x97\xa0\xe5\xae\x9a\xe6\xb3\x95\xe8\x80\x8c\xe6\x9c\x89\xe6\x96\xb9\xe6\xb3\x95'
>>> type(b1) # 转成了byte类型
<class 'bytes'>
>>>
图像读写
我们知道图像有专门的编码,比如jpg,png等,在不同的图像编辑器里面,他们可以解码不同类型图像进行处理。
在本任务中,暂时不需要进行复杂的操作,我们只需要读取普通文件一样,读取此文件。但是要注意,图像的编码是不能用文本编码去处理的,因此需要通过二进制的形式打开。
示范如下:
python
with open('test.jpg', 'rb') as f:
read_info = f.read()
print(read_info)
输出如下(仅部分):
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00
是二进制的byte类型。
这时候我们如何志勇使用bytes.decode(read_info)进行编码,发现会报错,错误信息如下。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
这是因为我们系统默认将此二进制信息按照通用utf-8的格式去转,我们是图片呀,这怎么能转成功了,因此转换失败了。这时候介绍一种处理方式base64编码。
base64编码
Base64是一种"二进制到文本"的编码方法,它能够将给定的任意二进制数据转换(映射)为 ASCII 字符串的形式,以便在只支持文本的环境中也能够顺利地传输二进制数据。例如支持 MIME 的电子邮件应用,或需要在 XML 中存储复杂数据(例如图片)时。
要实现Base64,首先需要选取适当的64个字符组成字符集。一条通用的原则是从某种常用字符集中选取64个可打印字符,这样就能避免在传输过程中丢失数据(不可打印字符在传输过程中可能会被当做特殊字符处理,从而导致丢失)。
在 Python 中我们base64的解码与编码方法如下:
python
import base64
test_byte = bytes('我爱学习', encoding='utf-8')
print(test_byte)
b64_string = base64.b64encode(test_byte)
print(b64_string)
b64_byte = base64.b64decode(b64_string)
print(test_byte == b64_byte)
输出如下:
b'\xe6\x88\x91\xe7\x88\xb1\xe5\xad\xa6\xe4\xb9\xa0'
b'5oiR54ix5a2m5Lmg'
True
可以看到byte信息在base64编码与解码后依旧保持一致。
图像RSA加解密
为了安全,我们需要对传输的内容进行加解密,在加密时通过公钥进行加密,在解密时通过私钥进行解密。
编程要求
在右侧编辑器已经有部分服务端代码, 需要理解并补充代码,使其能够正常运行。
- 接受客户端发送过来的'get image'字符串,并打印;
- 读取图片,加密,然后传输。
python
from socket import *
import rsa
# 公钥和私钥字符串
PUB = b'-----BEGIN RSA PUBLIC KEY-----\nMIIECgKCBAEA0clXVz1AWzgNSm7F6phzkXMoHrMywLrYKuDhh4wwnTt/08CFFN/V\nQbNk7wioAHC04D/iAe8XAH26T+i8y8zErxTTxitRN38Lrf0S1y3q+XBvQfm9z5X7\n8o6dHx/u8PMMQzwpqQZeICupLZe0+h9dP2Y05wKwnP9xRDJYelzc1VvdlNJS9x0l\nrb41+x2851ULq0z5iLUpUb4cBA2vVZ60BHKr22IhysQQ0MhUX8JnNAcQacQXJI+j\n7ROoo0dySQiHGrUKsELfUIl3XSMPBF+vF2shZnldip+uOyyMfUz35YHtlHIbyAKD\nfXWx2nkf3lMd0Fq/YfdUUcJWm6qxgvVoeCInpT2xDC4QnPQFantHEJinupajFupF\n0GBZp+/KFbgNYWqRbJzqywKA0epdMvlQsHbNfG4AkdOE4jP/WHBq73xdutajtCbd\nlFGd/VISconfpx8E0Ouj2fvoOcNIk9ed3zPF1sRJ5WsYAP7Cp1aSa98Lg9phb68E\nzsaQBMt4+bZbuJ0TC9e73P36f9j9+Cj+kFS6rVRbVbPn+oI/HWPn2BJ5W0pR5Buh\niXWhlGV+KHII63SqVx7jSmKmuTJk87FWg2q7+/joLidXvUnZbUj1eroIRtDkNA9e\n3VwCdkzUvQaBvYIEzqxE7Ej5ZL0gQHa3honCSl4aFDq7QcBnO6kti98fJIY1K0Fh\n6J94WHs80J00paSkZK77leE410Lq7ImVpq3mNwjEvp0x8K4eRMllOUWaoUcqo8tW\nS8OT5mUuP604hdK6ZAtjN5yJz9ro2ii1SkGjcx0YDVpGdK5LjKgKtWBj4ZrFMLHE\nMEquwHDpRsWZRWILrIy9gYooav43kovGMaUdRLAzlkvC2oa66aCehugvvvoW9kmE\nzihIfFuLH7W8suj69XI8v//QLQATqTc+0bBgdNlASJVk7z1m5mlNUIBX33W5V6qe\nToexbo1w1+/7Bjo80ketY1avVVWbZVIEgu1bkT+Z+DVqoU4zw6JMopu2bzlQSGbG\nF+4A3w1CK7U4dCXV/Vh7nbGSgJXjpO+EM0Hk3VcBoGReTsq5AVVOYu2I6Xrjds3b\n/Dek81JRHKCcdto4ZSpuL+73NrQwhu09EByH63cOYoSAz6mWbsUev5B12bkIheaL\nYKfCud06McA0pq5VvqEpFZDjgyszHtuVbwDcQQaXzF0Jq6X1jojjfxIakI3xUvlA\nmNk8JkFX6VdZ1NI9KbFcIBqZxbmgXQbWM6K4bJ+GXEcFZkaVZuInEMI8ak6VjmCy\nPt7Ty4WPKeDNzPSNSBi3HPPPB/yfOiMATdGXsm/jKp97RILiDi72ccdHrfzYYeei\niH7d6Dne6nKGIyXZJeFrfB1hSBvlXmIGXQIDAQAB\n-----END RSA PUBLIC KEY-----\n'
PRI = b'-----BEGIN RSA PRIVATE KEY-----\n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\nwui+fB+tk56BUG9c6c0LjkQb7+Xb5Qtdf5QDtKM=\n-----END RSA PRIVATE KEY-----\n'
# 导入公钥,注意这里只是为了示例完整性,实际上发送方只需要公钥加密
pubkey = rsa.PublicKey.load_pkcs1(PUB)
# 如果是真实场景,服务端可能需要用私钥签名或解密客户端消息,但本题要求只用到加密发送
# privkey = rsa.PrivateKey.load_pkcs1(PRI)
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
serverSocket.bind(('', 6900)) # 将TCP欢迎套接字绑定到指定端口
serverSocket.listen(1) # 最大连接数为1
print('start...')
conn, address = serverSocket.accept()
print("连接成功")
try:
########### begin ##########
# 接受客户传来的请求,并打印消息
data = conn.recv(1024).decode()
print(data)
######### end ##################
with open('./src/step2/python.jpg', 'rb') as f:
read_info = f.read()
########## beigin #############
# 对图片信息进行加密,并发送出去
# 使用rsa库的encrypt方法,传入二进制数据和公钥
crypto = rsa.encrypt(read_info, pubkey)
conn.send(crypto)
############# end ##############
conn.close()
except IOError:
conn.close()
except Exception as e:
# 捕获其他可能的错误,例如图片过大导致rsa.encrypt报错
print(f"发生错误: {e}")
conn.close()