前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UDP和多线程服务器

UDP和多线程服务器

作者头像
端碗吹水
发布2020-09-23 10:34:19
2.2K0
发布2020-09-23 10:34:19
举报

UDP:

UDP是数据报文传输协议,这个传输协议比较野蛮,发送端不需要理会接收端是否存在,直接就发送数据,不会像TCP协议一样建立连接。如果接收端不存在的话,发送的数据就会丢失,UDP协议不会去理会数据的安全性,而且在网络繁忙、堵塞的时候会丢失一些数据,俗称“丢包”。

但是UDP协议的传输速度很快,基本是你的网络有多快就传输多快。所以游戏、直播、语音电话等功能都是得靠UDP来实现 ,TCP都是基于UDP开发的,就是在UDP上增加了各种安全措施保护了数据的安全,牺牲了传输的速度。

UDP传输数据的方式是把数据分成一个个的数据包,每个包都会限制数据的大小。

学习UDP的传输,我们需要用到两个类:DatagramSocket和DatagramPacket类,和TCP里学过的不一样的一点是DatagramSocket既可以做接收端,也可以做发送端。接收端需要声明端口号,发送端则不需要声明ip地址和端口号。接收端会有一个空的数据包,用来接存储发送端发过来的数据。发送端则是将数据包装成一个数据包,然后声明对方的ip地址和端口号接着就能将数据发送过去了。

示意图:

2e4e88bcbdfd22529541723db335475b.png
2e4e88bcbdfd22529541723db335475b.png

发送端代码示例:

cf7e8c8e4a2cfb40751d6801f92508ff.png
cf7e8c8e4a2cfb40751d6801f92508ff.png

接收端也可以限制IP的,设置成只接收某个IP的数据:

6457b8d4503082232f86721363382527.png
6457b8d4503082232f86721363382527.png

接收端代码示例:

60c39be6c55dfc0a26a8d14336d9bfbb.png
60c39be6c55dfc0a26a8d14336d9bfbb.png

运行结果:

9ead1fba43cccbc8e597daf6f26bea8e.png
9ead1fba43cccbc8e597daf6f26bea8e.png

多线程服务器:

到此之前我们编写的都是单线程的服务器端,单线程的服务器有一个坏处就是,在多人同时访问的时候会很缓慢。例如做个试验:在单线程的服务器端调用sleep方法让线程休眠3秒钟,然后运行服务器端,接着打开几个浏览器同时进行访问,会发现第一个浏览器停顿了3秒左右,第二个浏览器停顿了6秒左右,第三个浏览器停顿了9秒左右,这样以此类推的话速度实在太慢不忍直视。所以这时候就需要用到多线程来编写多线程服务器了,多线程就能同时的进行处理访问的客户端,而且在真正的开发中也不可能会用到单线程的服务器。

TCP多线程服务器代码示例:

0b6c414c14154fc116bf7b788d95fb85.png
0b6c414c14154fc116bf7b788d95fb85.png
28cbac21f7f5ed289508013db97cbee4.png
28cbac21f7f5ed289508013db97cbee4.png

运行结果:

9b7cc59f2fbebd8c8908692f02ee8475.png
9b7cc59f2fbebd8c8908692f02ee8475.png
62896baa7f7c75677fa429fb3d74bb72.png
62896baa7f7c75677fa429fb3d74bb72.png

UDP多线程服务器代码示例:

0a4f153d2871176aec64f5a9bfb8b883.png
0a4f153d2871176aec64f5a9bfb8b883.png
32e0b2a19877fb4aff8a8c76dc96019b.png
32e0b2a19877fb4aff8a8c76dc96019b.png

运行结果:

ad2dad90904eabe3b68b562cfa693642.png
ad2dad90904eabe3b68b562cfa693642.png
e50e0e2dba3214f954b87e5d42872f6d.png
e50e0e2dba3214f954b87e5d42872f6d.png

从运行结果可以看出来这种来一个线程开一个线程的方式的弊端,就是会开启无数个线程,导致资源占用很大。

线程池服务器:

所以这时候我们就需要用到线程池了,线程池能很好的管理线程资源,能够限制住不会导致资源占用很大。

TCP线程池服务器代码示例:

9862fa0d8c5e9584459bd70338722954.png
9862fa0d8c5e9584459bd70338722954.png
8689445deaad944c473f7ecd70ff5ad1.png
8689445deaad944c473f7ecd70ff5ad1.png

运行结果:

b0457068ea7b9c78a251792e6e72e4b0.png
b0457068ea7b9c78a251792e6e72e4b0.png
cee6aff59d0b4971857f6a1dea96fd74.png
cee6aff59d0b4971857f6a1dea96fd74.png

UDP线程池服务器代码示例:

09cdc3b1af7b6228c01027e2a79f3c05.png
09cdc3b1af7b6228c01027e2a79f3c05.png

运行结果:

8cdf942e91af0d10c745612835dcde6a.png
8cdf942e91af0d10c745612835dcde6a.png
5f284cf25affe01aa65b6a30214139c3.png
5f284cf25affe01aa65b6a30214139c3.png

从运行结果可以看出,使用线程池能够控制好线程的开启数量,从而不会导致线程的滥用,在计算机上的资源占用也就不会那么严重了。在开发中尽量使用线程池来编写多线程服务器,不使用线程池的话弊端很大。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档