zoukankan      html  css  js  c++  java
  • 计算机网络自顶向下第二章套接字编程作业

    前三个网上都有,最后一个自己做了一下,说实话自己思考还是有很多收获的。

    先看最后一个:

    多线程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
    
    '
                #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()
  • 相关阅读:
    [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)
    [luogu3230 HNOI2013] 比赛 (搜索+Hash)
    [luogu2317 HNOI2005] 星际贸易 (dp)
    [luogu2414 NOI2011]阿狸的打字机 (AC自动机)
    [bzoj3507 Cqoi2014]通配符匹配 (hash+DP)
    [luogu2054 AHOI2005] 洗牌 (数论)
    bzoj1491 [NOI2007]社交网络
    bzoj1022 [SHOI2008]小约翰的游戏John
    bzoj1088 [SCOI2005]扫雷Mine
    bzoj1295 [SCOI2009]最长距离
  • 原文地址:https://www.cnblogs.com/eenio/p/11494167.html
Copyright © 2011-2022 走看看