Python套接字的创建及基本应用

Python套接字的创建及基本应用

第1关:创建连接套接字

任务描述

本关任务:当一个客户端连接服务器时,在该服务器端创建一个连接套接字,并进行预处理。

相关知识

为了完成本关任务,你需要掌握创建套接字时需要进行的步骤:

  1. 创建socket对象;
  2. 端口绑定;
  3. 端口监听;
  4. 建立连接。
代码
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文件中的信息,该文件已经存在,无需用户自己创建。

相关知识

为了完成本关任务,你需要掌握:

  1. 从客户端接受消息的函数;
  2. Socket 中使用的二进制转换函数;
  3. 打开并读取指定文件;
  4. 字符串分割;

完成实验时,需要结合以上所有知识,各个知识点之间也不是各自独立的,需要融合、整体运用。

代码
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 响应报文来响应客户端发送的文件请求。

相关知识

为了完成本关任务,你需要掌握:

  1. socket中 HTTP 首部行的形式;
  2. 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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值