一.    传输层

在上述三层协议中我们,ip协议帮我们定位到子网络. mac地址帮我们定位到一台计算机,并与其通讯,

但本质上,计算机的通讯是为了应用程序能够通讯,而一台计算机上不可能运行一个应用程序

问题:

就像我们同时运行QQ软件和微信软件, 当计算机收到一个数据包时, 需要知道这个数据包到底是给

哪个应用程序的.

解决方案:

为每一个应用程序绑定一个端口号,  端口号就是一个数字, 取值范围为 0 -- 65536 其中 0 -- 1023是

系统保留的

再次捋清思路:

端口定位应用程序, ip 定位网络, mac 定位计算机

可以通过这三个地址,找到全世界计算机中唯一的一个应用程序, 使我们编写网络应用程序成为可能.

传输层协议 :

为什么要有传输层协议 ?

应用程序可相互传递数据了, 还记得在ip协议中有一个路由算法么? 会自动选择最佳的传输路径,

将导致你的数据包可能走了不同的路线, 造成接受顺序错乱, 以及发生丢包等, 为了保证数据传输的

完整性, 诞生了传输层协议!

TCP :基于链接传输数据, 可保证数据传输的完整性

优点 :通过三次握手来与服务器建立连接

可以保证数据的完整性.

a机器给b机器发送数据包, 要求b机器必须立即返回一个确认包,

a机器会等待一段时间,如果超时还没有收到确认, 则重发数据.

缺点:

传输效率低.

使用场景 :  文字聊天. 支付宝转账等,

UDP : 不需要建立连接,直接发送

缺点:

不能保证数据的完整性

优点:

传输效率比TCP高很多

使用场景 :  视频通话,语音通话, 游戏等.

socket 是什么?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,

Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,

一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的

规定去编程,写出的程序自然就是遵循tcp/udp标准的。

使用 socket:

在使用socket的时候用户需要关心的是, ip地址, port端口. 传输协议TCP/UDP,你要发送的数据data

在写网络编程的时候,必然是两台代码, 对应着客户端和服务器.

socket 的工作流程 :

一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,

这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。

生活中的场景就解释了这工作原理。

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),

调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器

(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,

服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭

连接,一次交互结束

服务端套接字函数

s.bind() 绑定(主机,端口号)到套接字

s.listen() 开始TCP监听

s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数

s.connect() 主动初始化TCP服务器连接

s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数

s.recv() 接收TCP数据

s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)

s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)

s.recvfrom() 接收UDP数据

s.sendto() 发送UDP数据

s.getpeername() 连接到当前套接字的远端的地址

s.getsockname() 当前套接字的地址

s.getsockopt() 返回指定套接字的参数

s.setsockopt() 设置指定套接字的参数

s.close() 关闭套接字

面向锁的套接字方法

s.setblocking() 设置套接字的阻塞与非阻塞模式

s.settimeout() 设置阻塞套接字操作的超时时间

s.gettimeout() 得到阻塞套接字操作的超时时间

面向文件的套接字的函数

s.fileno() 套接字的文件描述符

s.makefile() 创建一个与该套接字相关的文件

使用socket来完成TCP通讯

应该先完成服务器的代码编写

TCP 服务器 :

import  socket

# 1. 先创建一个代表服务器的socket对象

s = socket.socket()

# 2.  绑定ip地址与 端口号

# 127.0.0.1  表示当前电脑的ip

address = ('127.0.0.1',8090)          #传入ip与端口

s.bind((address))

print ('服务器已启动')

#  3. 开始监听这个端口

#  参数5 表示可以有五个处于半连接状态的连接.(不是控制最大连接数的参数.)

s.listen(5)

# 4. 接受连接请求

# 该函数是阻塞的. 会卡主程序的执行,必须等到有一个客户端进来才会继续执行.

它会返回一个元组, 第一个代表客户端的socket对象, 第二个是客户端的端口

client,c_address = s.accept()

print('有一个连接已建立')

# 5.读写数据

# 接受数据 , 参数1024是需要接受的字节数

res = client.recv(1024)

print(res)

# 6. 关闭连接

s.close()    (一般不会关闭服务器.都是关闭客户端)

TCP 客户端:

import  socket

# 1. 创建客户端的socket对象

c = socket.socket()

# 2. 连接到服务器

server_address = ('127.0.0.1',8080)    # 端口必须跟服务器一样

# 3.建立连接

c.connect(server_address)

# 4.读写数据

# 发送数据到服务器

c.send('hello 我是客户端')

# 5. 关闭连接

c.close()

使用socket来完成UDP通讯,一样是先创建服务端

UDP 服务端:

import  socket

# 1.创建socket对象

# 必须自己定义参数

s = socket.socket(type = socket.SOCK_DGRAM)

# 2. 绑定端口和ip

s.bind(('127.0.0.1',10000))

# 3. 接受数据. 接受数据的时候,没有客户端来连接,也会卡主,等待客户端来连接了.再正常运行程序

res = s.recv(1024)

print(res)

# 4.

UDP  客户端 :

import  socket

# 1. 创建客户端

c = socket.socket(type = socket.SOCK_DGRAM)

# 不需要连接, 可以直接发送数据,只需要知道对方的ip和端口即可.

c.sendto('这是UDP的客户端'.encode('utf-8'),(127.0.0.1,10000))

# 关闭客户端

c.close()

python课程思路_学习python课程第二十六天相关推荐

  1. 老男孩python视频教程 怎么样_学习Python效果怎么样?老男孩Python课程好不好?...

    python因为具有很大的优势和特点,受到了不‌‌少人的关注和喜欢,而且python现在市场上需求量非常高,就业机会也是比较多的,对于很多人不想面对淘汰制度,都想进一步提升自己,因此python培训便 ...

  2. python cookbook 豆瓣_学习python求推荐一波书籍?

    豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6)Many programmers who learn Python basics fall into the ...

  3. python小型编程_学习Python编程的11个资源

    用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因 ...

  4. python作品代码_学习python的一些心得体会

    初识python 专升本来到桂林电子科技大学的时候,谈及这个学校也许他是全国四所叫电子科技大学的学校,而我很幸运的从这个学校里毕业了,那个时候选修一门课程就是python的选修课,从此跟python结 ...

  5. python最佳编程_学习 Python 的最佳方式

    原标题:学习 Python 的最佳方式 Python 是世界上功能最多且最强大的编程语言之一.使用 Python,你可以编写自己的应用程序,创建游戏.设计算法.甚至编程一个机器人.学习 Python ...

  6. 29岁学python的建议_学习Python的建议

    Python是最容易入门的编程语言,没有之一.如果初学者接触的第一门语言是C或者C++,对他们来说最难的不是语法,而是容易出现内存泄漏.指针等问题.有时候排查这些问题对初学者的打击很大,尤其是没掌握排 ...

  7. python 字节流分段_学习Python又多了一种选择,原来是他!

    来源 | 异步 | 文末赠书 Python以功能完备而著称,正所谓"功能齐备"(batteries included).由Python的众多模块(module)组建起来的生态系统, ...

  8. python网校 哪个_学习Python有什么推荐的网课,书籍资料,以及该装哪个版本的Python?...

    初学者推荐<Python编程从入门到实践>第2版 这本书的第1版 重印30余次,热销750000册. 通过阅读本书,你将迅速掌握Python的基础知识,打下坚实的编程基础. 本书分为两大部 ...

  9. python如何询问_学习Python问?

    感谢各位捧场,今天是2017年的第一篇,因为在之前不断收到小伙伴们在后台关于Pytho学习相关的留言,所以想在今年开篇先做一个答疑,方便各位更好的学习: 1.现在学习Python2还是python3? ...

最新文章

  1. Nature综述:真菌的多样性:真菌的高通量测序及鉴定
  2. 在区块链上表白——使用C#将一句话放入比特币的区块链上
  3. [POJ1330 Nearest Common Ancestors]
  4. LaTeX 科技排版 课程
  5. MVVM模式的3种command总结[2]--RelayCommand
  6. html桌面刷新,桌面不能自动刷新怎么办
  7. REVERSE-PRACTICE-CthulhuOJ
  8. duty:用户名是手机号显示空格
  9. Storm入门(七)可靠性机制代码示例
  10. linux取消登陆管理器,自动登录linux(不使用登录管理器)
  11. 【写作技巧】毕业论文写作意义
  12. Part01、sqlalchemy 使用
  13. Vijos P1335 数独验证【谜题】
  14. 算法笔记(23)网格搜索及Python代码实现
  15. Win10一键修复所有dll缺失的方法
  16. LAMP架构简介与配置
  17. mac navicat 安装
  18. [zz]u盘做系统启动盘后容量变小的解决方法 8GU盘变成2G 或 xG变成2G
  19. 洛谷P4704 太极剑(乱搞)
  20. 织梦屏蔽广告法极限词和敏感词插件【防职业举报者恶意投诉被工商部门天价罚款】

热门文章

  1. ASP.NET Core on K8S深入学习(7)Dashboard知多少
  2. 技术达人“创造营”官宣:Microsoft Learn 学习平台C位出道
  3. 分布式Redis的分布式锁 Redlock
  4. 使用PerfView监测.NET程序性能(二):Perfview的使用
  5. 树莓派3B上部署运行.net core 2程序
  6. 小白带你入坑xamarin系列之环境搭建和准备
  7. 关系型数据库的分片原则
  8. C#码农的大数据之路 - 使用C#编写MR作业
  9. Vue 2017 现状与展望 | 视频+PPT+速记快速回顾
  10. .NET Core开源组件:后台任务利器之Hangfire