day26 网络编程
软件开发架构
开发软件,必须要开发一套 客户端 与 服务端
客户端与服务端的作用
服务端:24小时不间断提供服务
客户端:如果想要找服务,就去服务端
软件开发架构分两种
C/S架构:
Client:客户端
Server:服务端
优点:
软件的使用稳定,并且可以节省网络资源。
缺点:
1.若用户想要在同一个设备上使用多个软件,必须下载多个客户端。
2.软件的每次更新,客户端也必须跟着重新下载更新
c/s架构的软件:
例如:电脑上的qq,pycharm等,手机端的微信,王者荣耀等
B/S架构:
Browser:浏览器
Server:服务端
优点:
以浏览器充当客户端,无需用户下载多个软件,与也无需用户下载更新软件版本,直接在浏览器上访问需要使用的软件
缺点:
消耗网络资源过大,当网络不稳定时,软件的使用也会不稳定。
b/s架构的软件:
例如:在浏览器上输入某个软件的域名(http://oldboyedu.com/)
网络编程
网络发展历史
所有先进的技术都源自于军事,希望通过远程获取数据,所以出现了‘网络编程’。
早期如何实现远程通信:
打电话—》电话线
电脑—》网线,有线网卡
笔记本电脑—》有线网卡,无线网卡
要实现远程通信必须具备:
1.物理连接介质—》网卡
2.互联网协议:
人与人之间沟通的介质:中文,英语
计算机之间沟通的介质:“互联网协议”
互联网协议
互联网协议又称网络七层协议,osi七层协议
OSI七层协议:
-应用层
-表示层
-会话层
-传输层
-网络层
-数据链路层
-物理连接层
物理连接层
基于电信号发送出二进制的数据0101010101
数据链路层
数据链路层的 “以太网协议”,专门用于处理基于电信号发送出的二进制的数据
以太网协议
1.规定好电信号数据的分组方式。
2.每台连接网线的电脑都必须要有一块“网卡”
网卡有不同的厂商生产的
每块网卡都会有世界上独一无二12位的编号’“mac”地址。前六位:厂商号 后六位:流水号
交换机:
可以让多台电脑连接到一起。
基于以太网协议发送数据:
特点:
广播,单播
缺点:
广播风暴,不能跨局域网通信。
互联网:
让局域网之间进行通信
网络层
IP地址:用于标识唯一的一台计算机(局域网)的地址
IP:点分十进制
最小值:0.0.0.0
最大值:255.255.255.255
IPV4(了解):
一开始用电脑的人不多,所以出现了IPV4的协议版本
IPV6(了解):
包括IPV4
本机IP:回环地址 127.0.0.1——》localhost
传输层
TCP/UDP协议,基于端口工作的。
-端口号:标识电脑上的某一个软件
-端口号范围:0-65535
注意:
1.操作系统中,一般0-1024的端口都被默认使用了(0-1021不要动)
2.尽量使用8000以后的端口号 8001
开发中常用软件的默认端口号:
mysql:3306
mongodb:27017
Django:8000
Tomcat:8080
Flask:5000
Redis:6379
若想服务端与客户端进行通信,必须要建立连接,产生双向通道。
一条是客户端往服务端发送信息的。
另一条是服务端往客户端发送信息的
应用层
http
ftp
总结
ip :用于唯一标识某台计算机的位置。
port:端口用于确认计算机上的一个应用软件。
ip+port:世界上某台电脑上的一个应用软件
TCP协议的工作原理:
-TCP是一个流式协议
-三次握手,四次挥手
-三次握手键连接:
建立双向通道,建立好连接
-listen:监听
-established:确认请求连接
-发送数据:
write
read
客户端往服务端发送数据,数据存放在内存中,需要服务端确认收到,数据才会在内存中释放调,否则,会而一段时间发送一次,让服务端返回确认收到。在一段时间内,若服务端还是不反悔确认收到,则取消发送,并释放内存中的数据。
-四次挥手断连接
-TIME_WAIT:时间等待
Socket:
1.什么是Socket
socket是一个模块,可以写一套c/s架构的套接字
2.为甚要使用Socket
socket套接字会封装好各层协议的工作
好处:
可以节省开发成本。
3.如何使用
import scoket
注意:客户端与服务端必须遵循:
一端send 另一端recv
不能两端同时seng或recv
初始socket套接字
# 服务端*********************************
import socket
server=socket.socket()
#绑定(主机,端口号)到套接字
server.bind(('127.0.0.1',9527))
#开始TCP监听
server.listen(5)#listen(5)半连接池 设置等待程序个数
#被动接受TCP客户的连接,(阻塞式)等待连接的到来
# conn: 相当于服务端往客户端挖的管道
conn,addr=server.accept()
print(addr)
data=conn.recv(1024).decode('utf-8')
print(data)
conn.send('我不好'.encode('utf-8'))
conn.close()
server.close()
# 客户端*************************************
import socket
client=socket.socket()
#主动初始化TCP服务器连接
# client: 相当于客户端往服务端挖的管道
client.connect(('127.0.0.1',9527))
client.send('你好'.encode('utf-8'))
data=client.recv(1024).decode('utf-8')
print(data)
# 关闭连接
client.close()
循环通信套接字
# 服务端
import socket
server=socket.socket()
#绑定(主机,端口号)到套接字
server.bind(('127.0.0.1',9527))
#开始TCP监听
server.listen(5)#listen(5)半连接池 设置等待程序个数
#被动接受TCP客户的连接,(阻塞式)等待连接的到来
conn,addr=server.accept()
print(addr)
while True:
data=conn.recv(1024).decode('utf-8')
print(data)
if data=='q':
break
send_msg=input('server--->client').encode('utf-8')
conn.send(send_msg)
conn.close()
server.close()
# 客户端
import socket
client=socket.socket()
#主动初始化TCP服务器连接
client.connect(('127.0.0.1',9527))
while True:
send_msg=input('client--->srevre:').encode('utf-8')
client.send(send_msg)
if send_msg=='q':
break
data=client.recv(1024).decode('utf-8')
print(data)
client.close()
服务端多个客户端
# 服务端
import socket
server=socket.socket()
#绑定(主机,端口号)到套接字
server.bind(('127.0.0.1',9527))
#开始TCP监听
server.listen(5)#listen(5)半连接池 设置等待程序个数
while True:
#被动接受TCP客户的连接,(阻塞式)等待连接的到来
conn,addr=server.accept()
print(addr)
while True:
try:
data=conn.recv(1024).decode('utf-8')
print(data)
# mac和linux系统bug: b''
if len(data) == 0:
continue
if data=='q':
break
conn.send(data.encode('utf-8'))
except Exception as e:
print(e)
break
conn.close()
server.close()
# 客户端
import socket
client=socket.socket()
#主动初始化TCP服务器连接
client.connect(('127.0.0.1',9527))
while True:
send_msg=input('client--->srever:').encode('utf-8')
client.send(send_msg)
if send_msg=='q':
break
data = client.recv(1024).decode('utf-8')
print(data)
client.close()