python课程思路_学习python课程第二十六天

一.    传输层

在上述三层协议中我们,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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爱数应用容灾部署方案三

级联复制的异地容灾方案部署 爱数应用容灾部署方案可在异地部署远程容灾站点实现远程应用容灾方案,采用级联复制模型,在本地和远程分别部署容灾站点,克服实时复制对带宽延迟较高的缺点,获得最佳的容灾效果。并且可根据用户的网络和…

c# 按位与,按位或

最近在园子里看到了这篇文章,看完这篇会有意外收获:C#枚举高级战术https://mp.weixin.qq.com/s/yipaL6Acil-uxq_bDDgdyg想起了很久之前的自己的一篇总结,特地找出来------在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了半个下…

poj3160

http://poj.org/problem?id3160 题意读懂是关键,he chould choose to enter and give out a gift and hear the words from the recipient, or bypass the room in silence.通过这句话知道当收礼者给予的反应是负值时可以不加,flymouse decided to choo…

30张不明觉厉的照片,看几遍终于看懂了

全世界只有3.14 % 的人关注了爆炸吧知识网络上很多照片,虽然没经过PS,第一眼还是会觉得诡异。仔细看看才发现....哇噢!总觉得她的头上有一撮尖尖的毛?狗狗怎么做得出这个表情?震惊!发现没脖子的长颈鹿&…

域名服务器(DNS)工作原理

域名服务器工作原理 引言 只要您在互联网上发送电子邮件或浏览Web,您就会用到域名服务器,而您自己可能都不知道您在使用它们。域名服务器(即DNS)是互联网的相当重要且完全隐藏的部分,并且很神奇。域名服务器系统在全球…

排序集合的一个小坑

原来一直用SortList,SortedDictionary来作为键值对存储的排序集合来用,心中就默认是以key按ascall排序来存放的,在之前的案例中也没有出现问题,在最近一个demo中,打破了原来的自以为是的认识,因为在key中不…

python distplot 图_Python可视化23 |seaborn.distplot公司单变量分布图(直方图|核密度图),23seaborndistplot...

本文介绍seaborn.distplot绘制单变量分布图;之前文章介绍的核密度图(kernel density estimate (KDE))以及二者结合图。目录本文内容概要直方图核密度图直方图结合核密度图1、seaborn.distplotseaborn.distplot(a, binsNone,histTrue,kdeTrue,rugFalse, fitNone, his…

绘制矩形php,PHP_php绘制一个矩形的方法,本文实例讲述了php绘制一个矩 - phpStudy...

php绘制一个矩形的方法本文实例讲述了php绘制一个矩形的方法。分享给大家供大家参考。具体实现方法如下://1、创建画布$im imagecreatetruecolor(300,200);//新建一个真彩色图像,默认背景是黑色,返回图像标识符。另外还有一个函数 imagecrea…

爱是天时地利的迷信

1 别人撒娇你撒娇2 据说套着这个白袋子晒鞋鞋就不会发黄了。。3 蚂蚁:为什么要欺负我!4 这是天空的心电图吗5 有回应的喜欢真好 6 随主人这事儿原来是真的…7 被别人喜欢时的心理活动图自回忆专用小马甲你点的每个赞,我都认真当成了喜欢

如何做到 byte[] 和 十六进制 互转?

咨询区 alextansc:请问我如何实现将 byte[] 和 十六进制的string 进行互转?回答区 balrob:如果你的程序是基于 .NET5 的,可以使用 Convert 下新增的两个方法 ToHexString 和 FromHexString ,参考下面两个方法的定义。/…

转载 Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget

当图片过大,或图片数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget,要想正常使用则需分配更少的内存,具体的解决办法是修改采样值BitmapFactory.Options.inSampleSize,例如&a…

Juniper Firewall多进单出配制实例

Technorati 标签: juniper,多进单出,配置实例,firewallJuniper firewall多進單出配置。想法是這樣的用一台firewall將這幾條ISP線路都接入,再通過一個trunk口出來,通過一台L2 switch劃分出幾個VLAN,分別對應不同的ISP線路。這樣做的好處就不多…

php js 复选框选中,为每个选中的复选框显示相同的一组问题。 (PHP和JS / Jquery)...

你可以这样做,它可以帮助你......HTMLfunction show_ques() {var i $(this).attr(id).substr(-1);if ($(this).is(":checked")) {//get total count of question listvar nQue $("#quelist").find("div[class^que]").length;var is…

刷题≠学好数学,近百位名校名师告诉你,数学是怎么学好的?

▲ 点击查看 数学是个神奇的科目,它存在着一种“梯次掉队”的现象。不是说你低年级的知识学好了,高年级的知识就一定能学好。相信大家都有这种体会:一二年级孩子成绩不相上下,但到三四年级的时候,有一批学生的数学成绩…

android 系统之ContentProvider

基于上一篇的数据库操作,又写了一个ContentProvider的示例。把SQLiter 的数据提供出去供别的项目进行访问。 这一篇的代码要求熟悉SQLiter 的API. 首先,我们编写一个类extents ContentProvider ,重写他的方法。 URI 在http 中我们称为统一资源…

你是中层管理者?嗯,一个表面看似风光,实际却很 “鸡肋” 的重要岗位

这是头哥侃码的第246篇原创每年的六七月份,上海都会进入梅雨季节。这段时期的上海天气就好比大小姐的脾气,阴晴不定,完全看心情做事,心情好的时候,给你个阳光,让你的生活和休闲时光多一些灿烂,心…

20150203一些移动端H5小bug解决

都是一些我也不知道为什么会有的bug。 1. 在三星note2,小米2,页面加载后,页面有黑块. 那么提高被盖住的部分z-index。 2. iphone5 ,ios7.0.4,上文字显示不出 那么就先hide,setTimeout几百毫秒再show

重温SQL——行转列,列转行(转:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html)...

行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。 用传统的方法,比较好理解。层次清晰,而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法…

php正则获取标签,PHP通过正则匹配中文字符 过滤html标签 获取文本内容

正则匹配中文汉字根据页面编码不同而略有区别:GBK/GB2312编码:[x80-xff] 或 [xa1-xff]UTF-8编码:[x{4e00}-x{9fa5}]/u[php]$str "账单123";//GBK/GB2312使用:preg_match_all("/[\x80-\xff]/", $str, $chines…

python监控机票价格_喜欢旅行又怕吃土?让Python来爬取最便宜机票吧!

图源:videoblocks.com你喜欢旅行吗?这个问题通常会得到一个肯定的答案,随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗?”也许话题就到此为止了…