本博客是针对,《计算机网络自顶向下方法》一书第二章后面套接字编程作业,

所有代码均已上传至我的github:https://github.com/inspurer/ComputerNetwork

所有代码均本人亲自编写,有问题欢迎评论交流;

如需转载请联系:2391527690@qq.com

作业1: Web服务器

问题描述

使用Python开发一个简单的Web服务器,它仅能处理一个请求,具体而言,你的服务器将

当一个客户(浏览器)联系时创建一个连接套接字;

这个连接接受http请求;

解释该请求以确定所请求的特定文件;

从服务器的文件系统获得请求的文件;

创建一个由请求的文件组成的HTTP响应报文,报文前有首部行;

经TCP连接向请求的浏览器发送响应;

如果文件不存在,返回404 Not Found

问题解决

主要代码

服务端代码

from socket import *

serverSocket = socket(AF_INET, SOCK_STREAM)

serverSocket.bind(("127.0.0.1",9999))

serverSocket.listen(1)

# 没有客户端链接时一直在此阻塞

connectionSocket, addr = serverSocket.accept()

while True:

print('waiting for connection...')

try:

#接收1k数据

data = connectionSocket.recv(1024)

print(data)

if not data:

continue

#data是一个get的http请求报文

filename = data.split()[1] #filename = /HelloWorld.html

# #print(filename[1:])

f = open(filename[1:],encoding="utf-8") #f = HelloWorld.html

outputdata = f.read()

header = 'HTTP/1.1 200 OK\r\n\r\n'

#回复报文

connectionSocket.send(header.encode())

for i in range(0, len(outputdata)):

connectionSocket.send(outputdata[i].encode())

#connectionSocket.close()

except IOError:

header = 'HTTP/1.1 404 NOT FOUND\r\n\r\n'

connectionSocket.send(header.encode())

connectionSocket.close()

# 浏览器键入 localhost:***/index.html会有两个请求

# index.html && favicon.ico(网站的图标)

客户端代码

from socket import *

ClientSocket = socket(AF_INET, SOCK_STREAM)

ClientSocket.connect(('localhost',9999))

while True:

#这里的Connetction: close不同于浏览器常见的keep-alive,

#close表示要求服务器在发送完被请求的对象后就关闭这条链接

Head = '''GET /index.html HTTP/1.1\r\nHost: localhost:9999\r\nConnection: close\r\nUser-agent: Mozilla/5.0\r\n\r\n'''

ClientSocket.send(Head.encode('utf-8'))

data = ClientSocket.recv(1024)

print(data)

with open("response.html","wb") as f:

f.write(data)

How to run

首先运行服务端代码WebServer.py

可以直接运行WebClient.py

此时会在工程下得到一个响应文件response.html

也可以在浏览器输入localhost:9999/index.html

浏览器方式时,需要取消对服务端代码第25行#connectionSocket.close()的注释再运行,至于为什么是这样,这是个历史遗留问题,有兴趣还是私戳我邮箱交流吧。

捕获.PNG

作业2: UDP ping程序

问题描述

使用python采用UDP协议编写一个ping程序,发送一个简单的ping报文给服务器,并确定从客户发送ping报文服务器到接受到pong报文为止的时延,称为往返时延(RTT) 。

因为UDP是一个不可靠的协议,客户发送的分组可能会丢失,为此,客户不能无限期地等待服务器的响应,等待时间至多为1s,否则,打印一条错误信息。

问题解决

主要代码

服务端代码

import random

from socket import *

#AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6

#SOCK_DGRAM指定了这个Socket的类型是UDP

serverSocket = socket(AF_INET, SOCK_DGRAM)

#用0.0.0.0绑定到所有的网络地址,还可以用127.0.0.1绑定到本机地址

serverSocket.bind(('127.0.0.1',12000))

while True:

#产生一个0到10之间的随机数

rand = random.randint(0, 10)

#从套接口上读取数据,参数为缓冲区大小

message, address = serverSocket.recvfrom(1024)

#通过打印我们可以看到UDP客户端socket的端口是不确定,系统随机分配的

print("收到来自 %s 的报文: (%s)" % (address,message))

# 把接收到的信息全部转为大写

print("随机数是: %d" % rand)

message = message.upper()

#如果随机数小于4,服务端无应答,客户端就会超时

if rand < 4:

continue

serverSocket.sendto(message, address)

客户端代码

import time

from socket import *

serverName = '127.0.0.1' # 主机

serverPort = 12000

# 创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6

# SOCK_DGRAM指定了这个Socket的类型是UDP

# SOCK_STREAM指定使用面向流的TCP协议

clientSocket = socket(AF_INET, SOCK_DGRAM)

clientSocket.settimeout(1) # 设置超时时间为1s

for i in range(0, 10):

oldTime = time.time()

sendTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(oldTime))

# encode()把str转成bytes,传输格式要求

message = ('package %d,client_local_time:%s' % (i + 1, sendTime)).encode()

try:

# 发送数据

clientSocket.sendto(message, (serverName, serverPort))

# 1024指定要接收的最大数据量为1kb = 1024 bytes

# recvfrom是一个系统调用,由用户态转向系统态,从套接口上接收数据,并捕获数据发送源的地址。

# 如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误

# 如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,果没有在Timeout = 1s内接收到数据,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达

# UDP的 recvfrom() 和 TCP 的recv()不一样,具体可以看 TCP Ping项目

modifiedMessage, serverAddress = clientSocket.recvfrom(1024)

# 计算往返时间

rtt = time.time() - oldTime

# decode 把bytes转成str

modifiedMessage = modifiedMessage.decode("utf-8")

print('报文 %d 收到来自 %s 的应答: %s,往返时延(RTT) = %fs' % (i+1, serverName,modifiedMessage, rtt))

except Exception as e:

print('报文 %d: 的请求超时' % (i+1)) # 处理异常

How to Run

先运行服务端代码,再运行客户端代码,注意不要占用端口。

2.PNG

邮件客户

问题描述

使用STMP协议从一个邮箱向另一个邮箱发送邮件

问题解决

主要代码

#作业3:邮件客户

from smtplib import SMTP

from email.mime.text import MIMEText

from email.header import Header

mail_server = 'smtp.163.com'

#根据发送方邮箱确定邮箱服务器

#qq邮箱的服务器为smtp.qq.com;163邮箱为smtp.163.com

def get_mail_server(sender):

key = sender[sender.index('@')+1:]

return "smtp."+key

port = '25' ## SMTP协议默认端口是25

sender = '2391527690@qq.com'

mail_server = get_mail_server(sender)

sender_pass = 'put your mail_code here' #注意是授权码,而不是登录密码,需要在邮箱端先获取

receiver = 'csu_xiaotao@163.com'

mail_msg = 'this is a demo'

#第一个参数就是邮件正文,

# 第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',

# 最后一定要用utf-8编码保证多语言兼容性。

msg = MIMEText(mail_msg, 'plain', 'utf-8')

msg['From'] = sender

msg['To'] = receiver

#Header对象编码文本,包含utf-8编码信息和Base64编码。

msg['Subject'] = Header('来自inspurer的个人计算机', 'utf-8')

try:

server = SMTP(mail_server, port)

#用set_debuglevel(1),可以打印出和SMTP服务器交互的所有信息

#server.set_debuglevel(1)

server.login(sender, sender_pass)

#由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str

server.sendmail(sender, (receiver), msg.as_string() )

server.quit()

print("邮件发送成功!")

except:

server.quit()

print("邮件发送失败!")

How to Run

直接运行stmpDemo.py,注意代码里的邮箱授权码要填成你自己的,它和邮箱登录密码不一样,至于怎么获取百度吧,我不做搬运工

3.PNG

4.PNG

作业4: 多线程Web代理服务器

写到这发现深夜了,以后更新

python实现邮件客户端_python socket实现web服务器,邮件客户端相关推荐

  1. python tcp服务器模板_python socket之tcp服务器与客户端示例

    Python中用socket编写服务器和客户端... 先说下我的问题,本来预想是,客户端连上服务器,然后向服务器发送信息服务器端代码 while 1: buf = s.recv(1024) 改成 wh ...

  2. 如何实现服务器转发客户端消息,socket 怎么实现服务器与客户端不停的互发消息呢?...

    在 java Socket应用的 3-4节 我把老师的代码修改了一下可以手动输入文字让对面的服务器/客户端接受, 下面是代码: //客户端 package 通讯; import java.io.Buf ...

  3. python应用系列教程——python使用socket创建tcp服务器和客户端

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建tcp服务器和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户输 ...

  4. socket 请求Web服务器过程

    HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有"连接建立"的发生. 而有人或许会问:众所周知,HTTP协议有两大特性, ...

  5. Web服务器对客户端请求的响应信息是,图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应...

    一.问题 解释Web服务器是如何处理HTTP事务的 二.Web服务器 Web服务器会对HTTP请求进行处理并提供响应.Web服务器请求的七大步骤: 1)接受客户端连接 2)接收请求报文 3)处理请求 ...

  6. python实现web服务器_python实现静态web服务器

    HTTP协议简介 HTTP请求 1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据: 路径:/full/url/path: 域名:由 ...

  7. python十大框架_python 十大web框架排名总结

    0 引言 python在web开发方面有着广泛的应用.鉴于各种各样的框架,对于开发者来说如何选择将成为一个问题.为此,我特此对比较常见的几种框架从性能.使用感受以及应用情况进行一个粗略的分析. 1 D ...

  8. 用python画分时图_Python socket编程之四:模拟分时图

    建立 socket,先运行服务器,再运行客户端,建立连接后服务器从本地数据库调数据一截一截地发送给客户端,客户端接受数据绘图模拟分时图 1.socket # -*- coding: utf-8 -*- ...

  9. python部署到服务器上解析不到模块_python socket模块放到服务器上就跑不了了 -问答-阿里云开发者社区-阿里云...

    话不多说直接放代码: 先说一下,下面出现的101.133.229.251是我服务器IP 客户端: import socket s = socket.socket(socket.AF_INET,sock ...

最新文章

  1. Java遇见HTML——JSP篇之JSP指令与动作元素
  2. myeclipse智能提示设置
  3. 关于ASP.Net的导入导出的[转]
  4. 苦逼的.net程序员, 转行高富帅iOS移动开发
  5. Win11锁屏快捷键是什么 Win11锁屏的方法
  6. python创建类mymath_构建DLL(MyMathFuncs)以在Python Ctypes中使用
  7. 计算机网络第三版周舸答案,计算机网络技术基础第3版周舸第一章节计算机网络基础知识课件教学.ppt...
  8. JNI详细调用(附带图文)
  9. JavaScript--对象类型详解
  10. 街头篮球 服务器中断,win7系统下玩街头篮球卡机如何解决
  11. 智能文档处理IDP关键技术与实践-高翔
  12. 面试:你的离职原因该怎么回答
  13. 学不学吴恩达deeplearning.ai课程,看完这篇你就知道了
  14. php WEB报表工具的设计
  15. VS中C++导入并使用DLL文件使用步骤
  16. 将自己的网站(html页面)做成链接分享给他人(建议使用vercel)
  17. C++语言学习(十四)——C++类成员函数调用分析
  18. 元数据管理系统的研究与实现
  19. 【编程笔试】美团2021校招笔试-通用编程题第6场(附思路及C++代码)
  20. 那些你投的基金没告诉你的事

热门文章

  1. 前端 vue antdv table导出execl
  2. linux如果时间等于22点,Linux下ntpdate时间同步
  3. 百度云服务器最新活动,百度云服务器1折_云服务器超值优惠_特价云服务器促销活动-天互数据...
  4. GitHub停用俄罗斯公司开发者账号
  5. GitHub 多次宕机的罪魁祸首竟是 MySQL?
  6. Angular 导致公司损失数十亿美元!
  7. 这一次,苹果、Google、微软选择了统一战线!
  8. C++落选,2021年最想学习的五大编程语言
  9. 腾讯否认微信测试语音消息进度调节​;监证会同意蚂蚁集团科创板IPO注册;React 17 正式版发布|极客头条
  10. 全网最详细 TCP 参数讲解,再也不用担心没有面试机会了......