目录
声明:题目来源于头歌计算机网络实验
Web服务器编程实现
创建流式套接字
#import socket module
from socket import *
mySocket = socket(AF_INET, SOCK_STREAM)
#Prepare a sever socket
########## Begin ##########
mySocket.bind(('127.0.0.1',6789))
mySocket.listen(1)
########## End ##########
print(mySocket)
mySocket.close()
服务端获取连接请求
#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
#Prepare a sever socket
serverSocket.bind(("127.0.0.1",6789))
serverSocket.listen(1)
#while True:
#Establish the connection
print('开始WEB服务...')
try:
########## Begin ##########
connectionSocket,addr=serverSocket.accept()
message=connectionSocket.recv(1024)
########## End ##########
print(addr[0])
print(message)
connectionSocket.close()
except IOError:
connectionSocket.close()
serverSocket.close()
服务端读取请求文件内容
温馨提示:出现`OSError: [Errno 98] Address already in use`时可以添加`serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)`以设置端口可复用,因为通常每个套接字地址(协议/网络地址/端口)只允许使用一次
#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
#Prepare a sever socket
serverSocket.bind(("127.0.0.1",6789))
serverSocket.listen(1)
#while True:
print('开始WEB服务...')
try:
connectionSocket, addr = serverSocket.accept()
message = connectionSocket.recv(1024) # 获取客户发送的报文
#读取文件内容
######### Begin #########
str=message.split()[1]
str1=str.decode('utf-8')
str1=str1.replace("/","")
#print(addrs)
files=open(str1,'r')
outputdata=files.read()
files.close()
######### End #########
print(outputdata)
connectionSocket.close()
except IOError:
connectionSocket.close()
serverSocket.close()
服务端响应请求头部信息
就在前面基础上增加的代码
#发送响应的头部信息
header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (len(outputdata))
#########Begin#########
#把字符串编码成字节码
connectionSocket.send(header.encode())
#########End#########
服务端响应请求的正文
#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
#Prepare a sever socket
serverSocket.bind(("127.0.0.1",6789))
serverSocket.listen(1)
#while True:
print('开始WEB服务...')
try:
connectionSocket, addr = serverSocket.accept()
message = connectionSocket.recv(1024) # 获取客户发送的报文
#读取文件内容
filename = message.split()[1]
f = open(filename[1:])
outputdata = f.read();
#向套接字发送头部信息
header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (len(outputdata))
connectionSocket.send(header.encode())
#发送文件内容
#########Begin#########
for i in range(0,len(outputdata)):
connectionSocket.send(outputdata[i].encode())
#########End#########
#关闭连接
connectionSocket.close()
except IOError: #异常处理
#发送文件未找到的消息
#关闭连接
connectionSocket.close()
#关闭套接字
serverSocket.close()
服务端异常(文件不存在异常)处理
#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
#Prepare a sever socket
serverSocket.bind(("127.0.0.1",6789))
serverSocket.listen(1)
#while True:
print('开始WEB服务...')
try:
connectionSocket, addr = serverSocket.accept()
message = connectionSocket.recv(1024) # 获取客户发送的报文
#读取文件内容
filename = message.split()[1]
f = open(filename[1:])
outputdata = f.read();
#向套接字发送头部信息
header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (len(outputdata))
connectionSocket.send(header.encode())
#S发送请求文件的内容
for i in range(0, len(outputdata)):
connectionSocket.send(outputdata[i].encode())
#关闭连接
connectionSocket.close()
except IOError: #异常处理
#发送文件未找到的消息
header = ' HTTP/1.1 404 not Found'
#########Begin#########
connectionSocket.send(header.encode())
#########End#########
#关闭连接
connectionSocket.close()
#关闭套接字
serverSocket.close()
UDP Ping程序实现
注意编码、sento函数的参数(msg,addr)其中addr是一个元组(ip,port)
这里仅仅实现了客户端向服务器发送消息并接收消息。运作框架就是客户端创建一个套接字后循环向服务器发送数据包,接收到回复后计算时间差,如果超时1s就算丢包,这样就大致描绘出了Ping应用程序反映网络通信状况(如丢包率)的功能
from socket import *
import time
serverName = '127.0.0.1' # 服务器地址,本例中使用本机地址
serverPort = 12000 # 服务器指定的端口
clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建UDP套接字,使用IPv4协议
clientSocket.settimeout(1) # 设置套接字超时值1秒
for i in range(0, 9):
sendTime = time.time()
message = ('Ping %d %s' % (i+1, sendTime)).encode() # 生成数据报,编码为bytes以便发送
try:
########## Begin ##########
# 将信息发送到服务器
clientSocket.sendto(message,(serverName,serverPort))
# 从服务器接收信息,同时也能得到服务器地址
modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
########## End ##########
rtt = time.time() - sendTime # 计算往返时间
print('Sequence %d: Reply from %s RTT = %.3fs' % (i+1, serverName, rtt)) # 显示信息
except Exception as e:
print('Sequence %d: Request timed out.' % (i+1))
clientSocket.close() # 关闭套接字