计算机网络实践——网络应用编程 python实现

目录

Web服务器编程实现

创建流式套接字

服务端获取连接请求

服务端读取请求文件内容

服务端响应请求头部信息

服务端响应请求的正文

服务端异常(文件不存在异常)处理

UDP Ping程序实现

ICMP Ping实现


声明:题目来源于头歌计算机网络实验

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() # 关闭套接字

ICMP Ping实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值