計算機網絡自頂向下第二章套接字編程作業


前三個網上都有,最后一個自己做了一下,說實話自己思考還是有很多收獲的。

先看最后一個:

多線程Web代理服務器

服務端:如圖,使用多線程,注意serverSocket.accept()不能寫在循環里面,因為我們使用tcp建立連接,建立一次連接就足夠,寫在循環里面的話客戶端只能發送一次請求,然后就必須斷開再建立連接,

from socket import *
import threading
"""
...忘記保存 能夠接受http請求並返回信息,並且能夠同時接受多個請求 """ serverPort = 12000 serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind(('localhost', serverPort)) serverSocket.listen(5) def connect(): print(threading.current_thread().getName(), " 等待接受數據中...") connectSocket, adress = serverSocket.accept() while True: message = connectSocket.recv(1024).decode() print(threading.current_thread().getName()," 接受到了", adress, "的數據", message) connectSocket.send(message.upper().encode()) # 多線程運行connect函數 threads = [] for i in range(5): threads.append(threading.Thread(target=connect)) threads[i].start()

客戶端:建立一次連接便可以一直發送數據

from socket import *

ClientSocket = socket(AF_INET, SOCK_STREAM) ClientSocket.connect(('localhost', 12000)) # 模擬瀏覽器發送請求 while True: fileName = input("資源名:") ClientSocket.send(fileName.encode()) data = ClientSocket.recv(1024) print("接收到數據", data.decode()) with open("response2.txt", mode="a+", encoding="utf-8") as f: f.write(data.decode())

運行結果如圖,開啟多個客戶端,可以持續發送信息:

 

 

 

 

 

 

 

 

 不過這里有一個缺陷,就是一旦建立了連接,就只能與這個客戶端進行通信,客戶端斷開之后服務端並不會斷開繼續等待下一個連接,所以我們可以采取下面的策略:

1.在客戶端加上如果請求的資源名為xxx時,斷開連接

2.在服務器檢測連接是否斷開,斷開了則恢復accept狀態

更改代碼如下,即可解決上述問題:其實就是加了當輸入為cut,斷開連接,關閉客戶端,關閉服務器端與客戶端的連接,這樣就可以形成一個最大為5的服務,並且客戶端可以隨意進出。。。

from socket import *
import threading
"""
...忘記保存
能夠接受http請求並返回信息,並且能夠同時接受多個請求
"""
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('localhost', serverPort))
serverSocket.listen(5)
def connect():
    print(threading.current_thread().getName(), " 等待接受數據中...")
    connectSocket, adress = serverSocket.accept()
    while True:
        message = connectSocket.recv(1024).decode()
        print(threading.current_thread().getName(), " 接受到了", adress, "的數據", message)
        if message == "cut":   # 斷開連接 ------------
            connectSocket.close()
            break
        connectSocket.send(message.upper().encode())

# 多線程運行connect函數
threads = []
for i in range(5):
    threads.append(threading.Thread(target=connect))
    threads[i].start()

客戶端

 
         
from socket import *

ClientSocket = socket(AF_INET, SOCK_STREAM)
ClientSocket.connect(('localhost', 12000)) # 模擬瀏覽器發送請求

while True:
fileName = input("資源名:")
ClientSocket.send(fileName.encode())
data = ClientSocket.recv(1024)
if fileName == "cut": # ---------斷開連接
ClientSocket.close()
break
print("接收到數據", data.decode())
with open("response2.txt", mode="a+", encoding="utf-8") as f:
f.write(data.decode())
 
        

 

Web服務器

暫時沒有構成http報文進行發送,而是簡單的運行兩個程序進行交互

Server.py

"""" 任務說明:一個簡單的web服務器,有以下功能 1.使用TCP協議進行連接 2.接受http請求 3.對請求的文件進行響應 4.創建由請求的文件組成的Http響應報文 5.不存在文件則返回404 """ from socket import * # 創建tcp socket tcpSocket = socket(AF_INET, SOCK_STREAM) # 綁定地址 tcpSocket.bind(("127.0.0.1", 9999)) # 開始監聽 tcpSocket.listen(5) while True: print("等待連接中....") tcpConnect, adrr = tcpSocket.accept() print("接受到了來自:", adrr, "的數據") while True: try: data = tcpConnect.recv(1024) if not data: break print("接收到了數據", data) f = open(data, encoding="utf-8") result = f.read() # header = 'HTTP/1.1 200 OK\r\n\r\n' #tcpConnect.send(header.encode()) tcpConnect.send(result.encode()) except FileNotFoundError as e: tcpConnect.send("資源不存在".encode()) tcpConnect.close() print("連接結束")

Client.py

from socket import * ClientSocket = socket(AF_INET, SOCK_STREAM) ClientSocket.connect(('localhost', 9999)) # 模擬瀏覽器發送請求 while True: fileName = input("資源名:") ClientSocket.send(fileName.encode()) data = ClientSocket.recv(1024) print("接收到數據", data.decode()) with open("response2.txt", mode="a+", encoding="utf-8") as f: f.write(data.decode())

運行結果如下,可以看到請求的文件存在時就返回文件內容,不存在就返回提示信息

Client:

 

 

Server

 UDP,PING程序:

emmmm,這個不寫了,網上可以搜索到,,

郵件客戶:

這個參考菜鳥教程的,

import smtplib from email.mime.text import MIMEText from email.header import Header mail_host = 'smtp.qq.com' # 中轉服務器 mail_user = '2429160671@qq.com' mail_pass = 'xzfwjkhtpsrydjdh' sender = '2429160671@qq.com' # 發送方 receivers = ['2429160671@qq.com'] # 接收方 message = MIMEText('python 測試', 'plain', 'utf-8') message['From'] = Header("ennio", 'utf-8') message['To'] = Header("測試", 'utf-8') subject = 'python smtp 測試' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 建立連接 smtpObj.login(mail_user, mail_pass) # 登陸授權 smtpObj.sendmail(sender, receivers, message.as_string()) # 發送郵件 print("發送成功") smtpObj.close() except smtplib.SMTPException: print("Error......") smtpObj.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM