15-TCP编程&UDP编程&发邮件和发短信

一、网络编程

1.网络编程基础

3.png
1.1概念

计算机网络:把分布在不同区域的计算机【设备】与专门的一些外部设备通过通信线路相关联,形成一个网络系统,从而使得计算机之间可以共享数据

网络编程:同一个网络中不同的机器之间的通信

1.2计算机之间需要通信的必要条件

ip地址,端口,网络协议

1.>ip地址

​ 互联网协议地址【Internet Protocol Address】,是联网设备和互联网之间的唯一标识,在同一个网段中,ip地址是唯一的

​ ip地址是数字型,是一个32位的整数,

​ 举例:10.36.131.32:32位的整数,分成4个8位的二进制,将二进制转换为0~255之间的十进制整数

​ 分类:

​ a.形式分类

​ ipv4:分为4段

​ ipv6:分为6段

​ b.功能分类

​ A类:保留给政府机构,1.0.0.1~126.255.255.255

​ B类:分配中型企业,128.。。。。~191.。。

​ C类:分配个人,192...~223

​ D类:组播,224~239

​ E类:实验,240~255

​ 127.0.0.1:回送地址,一般指的是本机的ip,localhost,一般用来进行测试

​ 总结:ip地址可以唯一确定网络上的一个通信实体,但是一个通信实体上可能有很多的应用程序,可以同时提供网络服务,此时还需要借助于端口进行区分

2>端口

​ 数据的发送和接收都需要通过端口,端口号用于唯一标识通信实体上进行网络通信的程序

​ 注意:同一台机器上的不同的应用程序不能占用同一个端口,端口的范围:0~65535

​ 作用:ip地址结合端口号,就可以唯一的确定一个网络中唯一一台计算机上的一个应用程序

​ 分类:

​ a.公认端口:0~1023

​ b.注册端口:1025~49151

​ c.动态端口或者私有端口:1024~65535

​ 常用端口:

​ mysql: 3306

​ oracle:1521

​ tomcat:8080

​ qq:4000

3>网络协议

​ http: 被动式协议

​ tcp

​ udp

​ tcp/ip:互联网协议

二.TCP编程

tcp.png

Transmission Control Protocol,传输控制协议,是一个传输层的通信协议

客户端/服务端:套接字【socket】,程序通常通过套接字向网络发出请求或者应答网络请求,使得两台设备之间进行通信

理解;打开了一个网络连接,必须知道ip地址,端口号,协议

​ 特点:

​ a.安全的【确保接收方完全正确的接收数据】

​ b.面向连接【数据传输之前必须要建立连接】

​ c.传输的效率较低【面向连接需要耗时】

​ d.一旦连接建立,双方可以按照指定的格式发送数据【大小没有限制】

使用经典三次握手建立连接

​ a.客户端向服务端发起请求

​ b.服务端收到请求之后,会给客户端一个响应

​ c.客户端收到服务端的响应之后,给服务端回复一个确认信息

总结:使用tcp实现数据的发送和接收需要有发送方和接收方,但是两个通信实体之间没有明确的客户端或者服务端之分,在两个通信实体在建立连接之前,必须有一个通信实体先做出主动姿态,主动发起请求

2.1socket通信流程

代码演示:

server:

#服务端流程描述
import  socket

#1.创建服务端的socket对象
serverSocket = socket.socket()

#2.为socket绑定端口和ip地址
"""
bind(元组),将端口号和ip地址创建元组,然后传参
(host,port)
"""
#查看ip地址:在终端输入ipconfig命令
ip_port = ("10.36.131.32",6666)
serverSocket.bind(ip_port)

#3.服务端监听请求,随时准备接受客户端发来的连接
"""
listen(backlog)
backlog:在拒绝连接之前,可以挂起的最大连接数量
注意:不能无限大
"""
serverSocket.listen(5)

print("server waiting~~~~~")

#4.服务端接收到客户端的请求,被动打开进行连接
#accept();在连接的时候,会处于阻塞状态
#返回值:conn,address,conn表示连接到的套接字对象,address表示连接到的客户端的地址
conn,addr = serverSocket.accept()

#5.服务端接收消息
"""
recv(size)
可以一次性接收到多大的数据
"""
client_data = conn.recv(1024)
print(str(client_data,"utf-8"))

#6.服务端关闭
serverSocket.close()

client:

import  socket

#1.创建socket对象
clientSocket = socket.socket()

#2.发起连接请求
#connect(元组)
#(host,port)ip地址和端口号需要和服务端中绑定的ip地址以及端口号保持一致
ip_port = ("10.36.131.32",6666)
clientSocket.connect(ip_port)

#3.发送数据
#sendall(string) ,字节类型的字符串【编码的过程】
clientSocket.sendall(bytes("hello你好啊",encoding="utf-8"))

#4.关闭客户端
clientSocket.close()
2.2客户端和服务端的数据交互

代码演示:

server:

import  socket

server = socket.socket()

server.bind(("10.36.131.32",6666))

server.listen(5)

conn,address = server.accept()

print("连接成功")

while True:
    clientData = conn.recv(1024)
    result = clientData.decode("utf-8")
    print("客户端对服务端说:",result)

    if result == "bye" or result == "再见":
        break

    sendData = input("请输入要给回复客户端的数据:")
    conn.send(sendData.encode("utf-8"))

server.close()

client:

import  socket

client = socket.socket()

client.connect(("10.36.131.32",6666))

while True:
    sendData = input("请输入要发送给服务端的数据:")
    client.send(sendData.encode("utf-8"))

    serverData = client.recv(1024)
    result = serverData.decode("utf-8")
    print("服务端回复:",result)

    if result == "bye":
        break

client.close()

三.UDP编程

udp.png

User Datagram Protocol,用户数据包协议

特点:

​ a.不安全的

​ b.无连接

​ c.效率高,速度快

​ d.对数据的大小是有限制的,每个被传输的数据包的大小不超过64k

四、发邮件和发短信

1.发短信

互亿无线

#发送短信
#APIID:C11345804
#APIKEY:735d183ae02189f678c26800ac19b03a

代码演示:

# 接口类型:互亿无线触发短信接口,支持发送验证码短信、订单通知短信等。
# 账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html
# 注意事项:
# (1)调试期间,请使用用系统默认的短信内容:您的验证码是:【变量】。请不要把验证码泄露给其他人。;
# (2)请使用APIID(查看APIID请登录用户中心->验证码短信->产品总览->APIID)及 APIkey来调用接口;
# (3)该代码仅供接入互亿无线短信接口参考使用,客户可根据实际需要自行编写;

# !/usr/local/bin/python
# -*- coding:utf-8 -*-
import http.client
import urllib

host = "106.ihuyi.com"
sms_send_uri = "/webservice/sms.php?method=Submit"

# 用户名是登录用户中心->验证码短信->产品总览->APIID
account = "C11345804"
# 密码 查看密码请登录用户中心->验证码短信->产品总览->APIKEY
password = "735d183ae02189f678c26800ac19b03a"

def send_sms(text, mobile):
    params = urllib.parse.urlencode(
        {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'})
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    conn = http.client.HTTPConnection(host, port=80, timeout=30)
    conn.request("POST", sms_send_uri, params, headers)
    response = conn.getresponse()
    response_str = response.read()
    conn.close()
    return response_str


if __name__ == '__main__':
    #需要接受短信的目标手机号
    mobile = "18566666666"
    text = "您的验证码是:121254。请不要把验证码泄露给其他人。"

    print(send_sms(text, mobile))

2.发邮件

代码演示:

#发送纯文本
#发邮件的模块
import  smtplib
#邮件标题
from  email.header import Header
#邮件文本
from  email.mime.text import MIMEText

"""
user:用户名
pwd:授权码
sender:发送方
receiver:接收方
content:邮件的正文
title:邮件的标题
"""
def sendMail(user,pwd,sender,receiver,content,title):
    mail_host = "smtp.163.com"   #163的SMTP服务器

    #第一部分:准备工作
    #1.将邮件的信息打包成一个对象
    message = MIMEText(content,"plain","utf-8")   #内容,格式,编码
    #2.设置邮件的发送者
    message["From"] = sender
    #3.设置邮件的接收方
    #message["To"] = receiver
    #join():通过字符串调用,参数为一个列表
    message["To"] = ",".join(receiver)
    #4.设置邮件的标题
    message["Subject"] = title

    #第二部分:发送邮件
    #1.启用服务器发送邮件
    #参数:服务器,端口号
    smtpObj = smtplib.SMTP_SSL(mail_host,465)
    #2.登录邮箱进行验证
    #参数:用户名,授权码
    smtpObj.login(user,pwd)
    #3.发送邮件
    #参数:发送方,接收方,邮件信息
    smtpObj.sendmail(sender,receiver,message.as_string())

    print("mail send successful!")

if __name__ == "__main__":
    mail_user = "18501970795@163.com"
    mail_pwd = "yang0122"

    mail_sender = "18501970795@163.com"
    mail_receiver = ["1490980468@qq.com"]

    email_content = "人生苦短,我用Python"
    email_title = "Python"

    sendMail(mail_user,mail_pwd,mail_sender,mail_receiver,email_content,email_title)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容