计算机网络自顶向下第二章套接字编程作业

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

先看最后一个:

多线程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()

 

posted @ 2019-09-13 11:09  _Ennio  阅读(2155)  评论(1编辑  收藏  举报