前三个网上都有,最后一个本身作了一下,说实话本身思考仍是有不少收获的。
先看最后一个:
多线程Web代理服务器
服务端:如图,使用多线程,注意serverSocket.accept()不能写在循环里面,由于咱们使用tcp创建链接,创建一次链接就足够,写在循环里面的话客户端只能发送一次请求,而后就必须断开再创建链接,html
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()
客户端:创建一次链接即可以一直发送数据python
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())
运行结果如图,开启多个客户端,能够持续发送信息:web
不过这里有一个缺陷,就是一旦创建了链接,就只能与这个客户端进行通讯,客户端断开以后服务端并不会断开继续等待下一个链接,因此咱们能够采起下面的策略:浏览器
1.在客户端加上若是请求的资源名为xxx时,断开链接服务器
2.在服务器检测链接是否断开,断开了则恢复accept状态多线程
更改代码以下,便可解决上述问题:其实就是加了当输入为cut,断开链接,关闭客户端,关闭服务器端与客户端的链接,这样就能够造成一个最大为5的服务,而且客户端能够随意进出。。。app
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()
客户端socket
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报文进行发送,而是简单的运行两个程序进行交互tcp
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()
原文出处:https://www.cnblogs.com/eenio/p/11494167.html