1. 程式人生 > 其它 >Python 實現 UDPsocket 程式設計及簡單Web伺服器

Python 實現 UDPsocket 程式設計及簡單Web伺服器

技術標籤:pythonsocketweb

目錄

實驗內容

  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伺服器