文章目录

  • 一、软件开发架构
  • 二、网络编程简介
  • 三、OSI七层协议
  • 五、网络相关名词
  • 八、Socket套接字
  • 九、半连接池
  • 十、黏包问题

一、软件开发架构

     什么是软件开发架构?编写项目前需要遵循代码层面上的规范代码运行的流程 环节以及步骤软件开发结构总共分为两层架构 CS架构 BS架构(C客户端(Client)   S服务端(Server)     B浏览器(Broswer))客服端 就是在网络上下载的各个互联网公司的app软件服务端 可以看成是给你提供服务的软件(什么软件给你提供什么服务)浏览器 通过浏览器来充当服务端的客服端 想体验服务 但是可以不用下载客户端服务端的特征1. 24小时不间断的提供服务(打游戏想什么时候玩就什么时候玩)2. 固定的地址(固定的软件或者RLl 要是一天更新一次天天还去找怎么行)3. 可以同一时间服务多人(总不能微信我用了你就不能用了吧)架构优劣势CS架构优势: 下载对应的客户端 可以在客户端软件内定制或更新更多优质的服务劣势: 使用必须下载客户端比较繁琐(有的软件好几个G)BS架构优势: 不需要下载客户端就能够直接体验服务例如网页版的什么软件劣势: 不能高度定制想要的功能 需要遵循浏览器的模式架构发展趋势统一接口原则(微信 支付宝 里面的小程序可以直接体验其他软件的服务)

二、网络编程简介

     如何理解网络编程基于互联网编写代码 可以实现程序间的远程数据交互网络编程的目的网络编程的本质就是为了解决计算机之间的远程数据交互网络编程的意义学习完网络编程之后 我们就可以编写一个CS架构的软件网络编程的起源所有先进的技术一般都是源于军事网络编程由美国军方开发 没有网络编程两台计算机需要交互数据 只能使用硬盘拷贝(相隔十万八千里太麻烦了)网络编程的要求早期电话电脑 都需要有电话线网线网卡计算机之间想要实现远程数据交互 首要条件就是要有物理连接的介质否则无法相通

三、OSI七层协议

     七层协议规定了计算机涉及到远程交互的时候 必须要有的部件和流程七层  应用层>表示层>会话层>传输层>网络层>数据链路层>物理连接层>五层  应用层>传输层>网络层>数据链路层>物理连接层 (每一层都有各自的功能和规范)各层特征物理连接层保证物理连接介质的条件 传递电信号(主要研究插网线的情况)数据链路层规定了电信号的分组方式 每台电脑必须有一块网卡(电脑的以太网地址相当于身份证)简称MAC地址以太网地址由12位至16进制数组成的 前6位商品编号 后六位生产线水流号网络层IP协议规定了任何接入互联网的计算机都必须有一个IP地址IP地址IPV4:点分十进制最早0.0.0.0 最大255.255.255.255 随着社会的发展 同时能够上网的人越来越多了 ip地址不够用了IPV6:能够给地球上的每一粒沙子分一个IP地址(现在慢慢普及)IP特征每个IP都自带定位(这就是网警为什么可以找到你的原因)传输层PORT协议端口协议规定了一台计算机上正在运行的每一个运用都必须有一个端口号端口号相当于是计算机用来管理多个应用程序的标记端口号特征端口号范围: 0-65535端口号是动态分配同一时间同一计算机端口号不能冲突0-1024:一般是操作系统内部需要使用的1024-8000:一般是常见的软件已经使用了8000+:我们平时写代码可以使用8000之后的端口号传输层PORT协议TCP协议与UDP协议数据传输能够遵循的协议有很多 TCP和UDP是较为常见的两个TCP协议三次握手                    四次挥手建立双向通道(图1)          断开双向通道(图2)TCP传输数据非常安全 因为有双向通道 不容易丢失(每次发送之前保存一份)每次发送数据都需要返回确认消息是否送达 否则在一定的时间会反复发送TCP类似于打电话:你一句我一句 有来有往UDP协议基于UDP协议发送数据 没有任何的通道也没有任何的限制UDP发送数据没有TCP安全(没有二次确认机制)UDP类似于发短信:只要发送了 不管别人看没看到 也不管回不回复应用层主要取决于程序员自己采用什么策略和协议常见协议有:HTTP HTTPS FTP...IP+PORTIP        用于标识全世界任意一台接入互联网的计算机PORT    用于标识一台计算机上的某个应用程序IP+PORT   用于标识全世界任意一台接入互联网的计算机上的某一个具体的程序网址网址RUL 统称统一资源定位符RUL本质就是IP+PORT


五、网络相关名词

     交换机能够让接入交换机的多台计算机实现彼此互联以太网原理有了交换机之后 根据电脑的MAC地址就可以实现数据交互广播:先有了交换机 所有接入交换机的设备都能收到单播:只有被查找的设备 才会回复相应信息缺陷MAC地址通信仅限于局域网接入交换机的设备过多 可能会造成广播风暴(很多设备一起广播被查找的设备接收不到)局域网由某个固定区域组成的网络广域网由更大的区域组成的局域网路由器将多个局域网连接到一起的设备

八、Socket套接字

 基于文件的类型套接字家族    AF_UNIX基于网络类型的套接字家族 AF_INET
 基本格式:服务端"""运行程序的时候  肯定是先确保服务端运行 之后才是客户端"""import socketserver = socket.socket()          # 1.创建一个socket对象 # 括号内什么都不写 默认就是基于网络的TCP套接字server.bind(('127.0.0.1', 8080))  # 2.绑定一个固定的地址(ip\port) # 127.0.0.1本地回环地址(只允许自己的机器访问)server.listen(5)                  # 3.半连接池(暂且忽略)sock, address = server.accept()   # 4.开业 等待接客print(sock, address)              # sock是双向通道 address是客户端地址sock.send(b'hello big baby~')     # 5.数据交互 # 朝客户端发送数据data = sock.recv(1024)            # 接收客户端发送的数据 1024bytesprint(data)                       sock.close()                      # 断开链接server.close()                    # 关闭服务器客户端'''服务端关机了 客户端也会关机'''client = socket.socket()                # 1.产生一个socket对象client.connect(('127.0.0.1', 8080))     # 2.连接服务端(拼接服务端的ip和port)data = client.recv(1024)                # 3.数据交互# 接收服务端发送的数据print(data)client.send(b'hello sweet server')      # 朝服务端发送数据client.close()                          # 4.关闭简单模拟一下聊天"""运行程序的时候  肯定是先确保服务端运行 之后才是客户端"""import socketserver = socket.socket()          # 1.创建一个socket对象 # 括号内什么都不写 默认就是基于网络的TCP套接字server.bind(('127.0.0.1', 8081))  # 2.绑定一个固定的地址(ip\port) # 127.0.0.1本地回环地址(只允许自己的机器访问)server.listen(5)                  # 3.半连接池(暂且忽略)sock, address = server.accept()   # 4.开业 等待接客print(sock, address)              # sock是双向通道 address是客户端地址while True:msg = input('请输入发给客户端的消息>>>:').strip()sock.send(msg.encode('utf8'))data = sock.recv(1024)print(data.decode('utf8'))import socket# 1.产生一个socket对象client = socket.socket()# 2.连接服务端(拼接服务端的ip和port)client.connect(('127.0.0.1', 8081))while True:     # 3.数据交互data = client.recv(1024)  # 接收服务端发送的数据print(data.decode('utf_8'))msg = input('请输入你要发给服务端的消息>>>:').strip()client.send(msg.encode('utf8'))  # 朝服务端发送数据

九、半连接池

 半连连接池server.listen(5)意思就是同时可以运行五个客户端 如果多于五个则会报错需要等待前面五个客户端其中一个结束 则会有多余的位置给到第六个

十、黏包问题

 1.TCP特性流式协议:所有的数据类似于水流 连接在一起的ps:数据量很小 并且时间间隔很多 那么就会自动组织到一起2.recv我们不知道即将要接收的数据量多大 如果知道的话不会产生也不会产生黏包
 serverimport socketserver = socket.socket()server.bind(('127.0.0.1', 8080))server.listen(5)sock, address = server.accept()sock.send(b'LebronJames')sock.send(b'hahaha')sock.send(b'shiwoa')clientimport socketclient = socket.socket()client.connect(('127.0.0.1', 8080))data = client.recv(1024)print(data)data = client.recv(1024)print(data)data = client.recv(1024)print(data)reseult: b'LebronJameshahahashiwoa' b'' b'''''会发现我们的结果会黏到一起 它的最大内存是1024bytes所以我们计算不到它是多大'''

'''所以我们需要学习一个新的模块 struct'''import structinfo = '啊对对对 我的偶像就是LebronJames!!!'print(len(info))                   # 25获取内容数据个数res = struct.pack('i', len(info))  # 将数据原本的长度打包    i 是一个模式print(len(res))                    # 4  打包之后的长度是4ret = struct.unpack('i', res)      # 将打包之后固定长度为4的数据拆包print(ret[0])                      # 25 又得到了原本数据的长度'''struct模块无论数据长度是多少 都可以帮你打包成固定长度然后基于该固定长度 还可以反向解析出真实长度struct模块针对数据量特别大的数字没有办法打包!!!'''思路1.先将真实数据的长度制作成固定长度 42.先发送固定长度的报头3.再发送真实数据1.先接收固定长度的报头  42.再根据报头解压出真实长度 3.根据真实长度接收即可
 serverimport socketimport osimport structimport jsonserver = socket.socket()server.bind(('127.0.0.1', 8081))server.listen(5)while True:sock, address = server.accept()while True:# 1.先构造数据文件的字典file_dict = {'file_name': 'LebronJames.txt','file_size': os.path.getsize(r'LebronJames.txt'),'file_desc': '内容很精彩 一定不要错过','file_root': 'LebronJames'}# 2.将字典打包成固定长度的数据dict_json = json.dumps(file_dict)file_bytes_dict = len(dict_json.encode('utf8'))dict_len = struct.pack('i', file_bytes_dict)# 3.发送固定长度的字典报头sock.send(dict_len)# 4.发送真实字典数据sock.send(dict_json.encode('utf8'))# 5.发送真实数据with open(r'LebronJames.txt', 'rb') as f:for line in f:sock.send(line)breakClientimport socketimport structimport jsonclient = socket.socket()client.connect(('127.0.0.1', 8081))while True:# 1.先接收长度为4的报头数据header_len = client.recv(4)# 2.根据报头解包出字典的长度dict_len = struct.unpack('i', header_len)[0]# 3.直接接收字典数据dict_data = client.recv(dict_len)  # b'{"file_name":123123123}'# 4.解码并反序列化出字典real_dict = json.loads(dict_data)print(real_dict)# 5.从数据字典中获取真实数据的各项信息total_size = real_dict.get('file_size')  # 32423423423file_size = 0with open(r'%s' % real_dict.get('file_name'), 'wb') as f:while file_size < total_size:data = client.recv(1024)f.write(data)file_size += len(data)print('文件接收完毕')break

Python网络编程(OSI Socket)相关推荐

  1. Python 网络编程(Socket)

    Python 网络编程(Socket) 一.Socket 套接字 1.Socket 编程 socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口.Socket ...

  2. 【CSDN软件工程师能力认证学习精选】Python网络编程(socket编程)

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  3. 10.python网络编程(socket server 实现并发 part 2)

    一.基于tcp的socket通信的基本原理分析. 基于tcp的socket通信,主要依靠两个循环,分别是连接循环和通信循环. 这个前面的文章有写过,在这里就不再重复了. 二.socketserver实 ...

  4. python网络编程--socket简单实现

    python网络编程                                                                                           ...

  5. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  6. Python网络编程(Socket)

    Python网络编程(Socket) Python提供了两个访问级别的网络服务.在一个较低的水平,您可以访问底层操作系统的基本套接字支持,允许你实现面向连接和无连接协议的客户端和服务器 Python有 ...

  7. Python网络编程基础之ip地址,端口号,TCP,socket

    Python网络编程基础 IP地址 ip地址表现形式 查看ip地址 Linux Windows 检查网络是否正常 端口与端口号 端口号分类 知名端口号 动态端口号 TCP协议 概念 TCP通讯步骤 特 ...

  8. 树莓派 Python 网络编程 (Socket入门)

    树莓派  Python 网络编程 (Socket入门) 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络 ...

  9. python php 全双工,Python网络编程之使用select实现socket全双工异步通信功能

    这篇文章主要介绍了Python网络编程使用select实现socket全双工异步通信功能,在这里分享给大家,有需要的朋友可以参考下 本文实例讲述了Python网络编程使用select实现socket全 ...

最新文章

  1. opencv中的Rodrigues()函数
  2. 刚盈利的DeepMind收购MuJoCo:转手开源,所有人免费用
  3. python接口自动化测试框架unittest代码_Python+unittest+requests 接口自动化测试框架搭建教程...
  4. wpf 代码获取contextmenu_[C#] 转:在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件...
  5. 苹果发生大规模宕机,网友调侃“突然白苹果了一会。”
  6. Linux驱动开发: USB驱动开发
  7. 哈希值定义,哈希值是怎么生成的
  8. Word中插入集合和元素的包含符号
  9. 12、Urban Radiance Fields
  10. 单链表指定结点的前插与后插(C/C++)
  11. 常见的软件系统集成方式和Smartbi集成解决方案
  12. java我的世界溺尸为啥这么少,我的世界:溺尸刷新几率存在问题?溺尸刷怪塔为何得不到三叉戟?...
  13. Mac已安装应用启动台不显示
  14. 手机连接电脑linux系统怎么样的,手机真能取代电脑吗?谈手机/PC系统的大一统...
  15. 北科大2019计算机分数线,2019北京科技大学录取分数线及历年专业分数线统计表【文科 理科】...
  16. python入门须知
  17. 手机内存卡转化linux,怎样把手机内存移至sd内存卡
  18. 深度学习环境配置之windows下的torch-gpu=1.7.1(亲测有效)
  19. Pytorch使用大核的卷积神经网络: RepLKNet
  20. 无限大平板隔声量理论及Matlab实现(Huang Mengqing论文复现)

热门文章

  1. 分享 10 个常见的 CSS 页面布局代码片段
  2. 其实,搭建一个有品质的棋牌游戏平台没那么复杂
  3. matlab lud矩阵分解,MIT线性代数总结笔记——LU分解
  4. 泰坦尼克号-数据加载及探索性数据分析
  5. 公众号怎么设置滑动文字_这种微信公众号里面滑动是怎么操作的?
  6. java程序员i5 i7_买电脑选择i5还是i7?很多人被忽悠了,专业人士说出了3点实话!...
  7. java.lang.NoSuchMethodError: org.springframework.http.MediaType.getCharSet()Ljava/nio/charset/Charse
  8. 在Linux上使用7z的最高压缩比来压缩文件
  9. 传入和传出电子邮件服务器,直接归档传入和传出的电子邮件【MDaemon篇】
  10. 汇编语言: txt文件操作