Python套接字的创建及基本应用
第1关:创建连接套接字
任务描述
本关任务:当一个客户端连接服务器时,在该服务器端创建一个连接套接字,并进行预处理。
相关知识
为了完成本关任务,你需要掌握创建套接字时需要进行的步骤:
- 创建
socket
对象; - 端口绑定;
- 端口监听;
- 建立连接。
代码
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET,SO_REUSEADDR
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 *********#
# 服务器端和客户端建立连接
conn,address=serverSocket.accept()
#********* End *********#
print("连接成功")
serverSocket.close()
第2关:服务器响应 HTTP 请求
任务描述
本关任务:在第一关的基础上进行解析客户端 HTTP 请求的操作,获取HelloWorld.html
文件中的信息,该文件已经存在,无需用户自己创建。
相关知识
为了完成本关任务,你需要掌握:
- 从客户端接受消息的函数;
- Socket 中使用的二进制转换函数;
- 打开并读取指定文件;
- 字符串分割;
完成实验时,需要结合以上所有知识,各个知识点之间也不是各自独立的,需要融合、整体运用。
代码
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET,SO_REUSEADDR
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
serverSocket.bind(("", 6789))
serverSocket.listen(1)
print('start...')
conn,address = serverSocket.accept()
print("连接成功")
try:
#********* Begin *********#
# 获取客户发送的报文,该对象名为message,并采用decode()函数对其解码,从二进制中还原字符串
a=conn.recv(1024)
message=a.decode()
#********* End *********#
print(message)
#********* Begin *********#
# 获取客户端想要获取的文件名,该文件名的对象名为filename
s=message.split(' ')[1]
filename=s[1: ]
#********* End *********#
print(filename)
#********* Begin *********#
# 获取文件的内容,文件对象名为f,内容为outputdata
f=open(filename)
outputdata=f.read()
#********* End *********#
print(outputdata)
conn.close()
except IOError:
print("no file")
conn.close()
serverSocket.close()
第3关:创建 HTTP 响应报文并返回客户端
任务描述
本关任务:在完成上一关挑战的基础上,创建一个 HTTP 响应报文来响应客户端发送的文件请求。
相关知识
为了完成本关任务,你需要掌握:
-
socket
中 HTTP 首部行的形式; -
socket
对象中信息的发送与编码。
代码
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET,SO_REUSEADDR
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
serverSocket.bind(('', 6789))
serverSocket.listen(1)
print('start...')
conn,address = serverSocket.accept()
print("连接成功")
try:
message = conn.recv(1024).decode()
filename = message.split()[1][1:]
f = open(filename)
outputData = f.read()
#********* Begin *********#
# 生成HTTP首部行,内容长度为outputData的长度
head='''HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 25
'''
#********* End *********#
#********* Begin *********#
# 发送该首部行给客户端
conn.send(head.encode())
#********* End *********#
print('you got it')
#********* Begin *********#
# 再次发送内容hello给客户端
text='''hello'''
conn.send(text.encode())
#********* End *********#
conn.close()
except IOError:
#********* Begin *********#
# 生成出现错误时的首部行,并将其发送给客户端
head1='''HTTP/1.1 404 Not Found'''
conn.send(head1.encode())
#********* End *********#
print('bad request')
conn.close()
serverSocket.close()