Python 实现 UDPsocket 编程及简单Web服务器

实验内容

  1. 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。具体如下:
    (1)Tom和Jerry聊天的双方都应该具有发送端和接收端;
    (2)利用DatagramSocket与DatagramPacket;
    (3)实现 java.lang.Runnable类,重写 run()方法。
  2. 利用Java Socket编写一个简单的Web服务器,具体如下:
    (1)使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象;
    (2)创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求;
    (3)获得浏览器请求,解析资源文件路径;
    (4)读取资源文件,响应给浏览器;
    (5)浏览器地址栏输入: http://localhost:8000/index.html;
    (6)效果如下:
    在这里插入图片描述

这里编码不限,所以我用了Python

实验代码

UDP socket编程

客户端

from socket import *

udp_client = socket(AF_INET, SOCK_DGRAM)

ip_port = ("127.0.0.1", 8080)

suffer_size = 1024
while True:
    client_data = input(">>>:").strip()
    if not client_data: continue
    udp_client.sendto(client_data.encode("utf-8"), ip_port)
    msg, addr = udp_client.recvfrom(suffer_size)
    print(msg.decode("utf-8"))

udp_client.close()

服务端

from socket import *

ip_port = ("127.0.0.1", 8080)
buffersize = 1024
#基于udp协议的套接字建立的对象不同于tcp协议的,tcp这里的参数:SOCK_STREAM,即:tcp数据流
#而,upd这里的参数:SOCK_DGRAM,即:数据报
#但是,tcp\udp都有一个AF_INET参数,即:基于网络
udp_service = socket(AF_INET, SOCK_DGRAM)#数据报
udp_service.bind(ip_port)
while True:
    # 基于udp协议的套接字,收消息使用recvfrom()方法,
    # 且收到的内容为tuple类型,内容包括:客户端真实想发的信息,客户端地址
    msg, addr = udp_service.recvfrom(buffersize)
    print(msg.decode("utf-8"))
    msg = msg.decode("utf-8")
    if msg == "你好,Tom":
        udp_service.sendto("你好!Jerry".encode("utf-8"), addr)
    elif msg == "雨雪阴晴,哪天更适合偶遇":
        udp_service.sendto("就是今天!".encode("utf-8"), addr)
    elif msg == "抱歉!你挡路了":
        udp_service.sendto("再见Jerry,我赶时间...".encode("utf-8"), addr)
    elif msg == "你的信息是?":
        udp_service.sendto("时之恋人".encode("utf-8"), addr)
    else:
        udp_service.sendto("抱歉!没听懂你再说什么".encode("utf-8"), addr)

udp_service.close()

先运行服务端,在运行客户端,然后实现对话

Web服务器简单实现

Web服务器

# coding:utf-8
import socket

ip_port = ("127.0.0.1", 8080)

back_log = 10
buffer_size = 1024

def main():
    #TCP传输
    web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, back_log)
    web_server.bind(ip_port)
    web_server.listen(back_log)
    print("Serving HTTP on port %s ..." % ip_port[1])

    while True:
        conn, addr = web_server.accept()

        requests = conn.recv(buffer_size)
        print(conn, addr)
        http_response = "HTTP/1.1 200 OK\r\n\r\n"
        conn.sendall(bytes(http_response, "utf-8"))  # 响应头
        with open("test.html", "rb") as f:
            html_data = f.read()
            conn.sendall(html_data)
        conn.close()
if __name__ == '__main__':
    main()

html文档

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello World!This is my Web Server!</h1>
</body>
</html>

参考资料

python:Socket编程(五):基于udp协议编程
python socket实现简单的web服务器
用python写一个简单的web服务器

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值