文档章节

UDP和多线程服务器

凯哥学堂
 凯哥学堂
发布于 2017/07/20 21:38
字数 895
阅读 46
收藏 0
点赞 0
评论 0

UDP:

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

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

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

发送端代码示例:

image

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

image

接收端代码示例:

image

运行结果:

image

多线程服务器:

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

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

image image

运行结果:

image image

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

image image

运行结果: image image

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

线程池服务器: 所以这时候我们就需要用到线程池了,线程池能很好的管理线程资源,能够限制住不会导致资源占用很大。 TCP线程池服务器代码示例: image image

运行结果:

image image

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

运行结果: image image

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

© 著作权归作者所有

共有 人打赏支持
凯哥学堂
粉丝 10
博文 285
码字总数 255922
作品 0
东城
程序员
C/S架构与多进程多线程

C/S架构与多进程多线程 如题,C/S架构指的是服务器(Server)与客户机(Client)协作完成网络程序功能的一种模式。它是已经在计算机世界活跃数十年的一种古老的软件架构。如今已渗入到各领域IT系...

cnyinlinux ⋅ 2015/04/30 ⋅ 0

acl 网络通信与服务器框架库示例列表

跨平台网络通信及服务器框架库 --- "acl" 项目里有大量的测试及应用示例,主要有三个示例集合,如下: 1、acl/samples:该目录下的例子主要是基于 libacl 及 libprotocol 两个库的例子 - 1....

郑树新 ⋅ 2014/07/15 ⋅ 0

Linux多线程并发服务器编程(线程池,FTP服务器)

分享网盘下载:https://pan.baidu.com/s/1gfNCcXt 密码: irfk 内容简介 本课程从最基础的进程、线程概念讲起逐步深入,通过理论与实践结合的方式,使学员快说掌握linux多线程网络编程技术,并...

人气王子333 ⋅ 2017/11/13 ⋅ 0

安全运维之:网络性能评估工具Iperf

一、 网络性能评估工具Iperf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理、网络存在安全漏洞等原因,都会导致网络带宽利用...

ning235 ⋅ 2014/10/23 ⋅ 0

安卓 IM 即时聊天应用怎么写的 用到什么技术 包括客户端与服务器端的 用SOCKET么?

Java TCP UDP了解一点 难道服务器与客户端通信是用UDP么? 像qq那样 一对一 多对多是怎么实现的 , 一对一由服务器将两个客户端建立连接么, 多对多是一旦有人发送信息,服务器将消息发送到所有的...

AaronW ⋅ 2015/05/20 ⋅ 4

网络服务器程序框架--ISE

ISE(Iris Server Engine)是一个基于现代C++的跨平台(Linux和Windows)的高性能多线程并发网络服务器程序框架。它封装了琐碎的socket以及各种操作系统APIs,以面向对象方式向开发者提供稳定...

haoxingeng ⋅ 2013/05/30 ⋅ 4

求一个需求的解决方案,能力有限,想不到更好的方法

需求是这样的:有很多台各个地市的服务器,通过udp数据包往固定的一台服务器上发送数据,我就在这台服务器上固定端口接收发送过来的udp数据包,然后解析提取数据包中的信息,再将信息存储在数...

steffven ⋅ 2014/06/18 ⋅ 19

memcached压力测试工具memslap使用说明

Memslap是memcached服务器的压力测试工具,它能产生可配置压力,如:线程、并发、连接、运行时间、覆盖、命中率、key的长度、value的长度、get/set比率等。另外,它还支持数据确认、失效时间...

jbaowei2000 ⋅ 2017/01/10 ⋅ 0

115-并发的 UDP 服务器

TCP 服务并发对我们来说已经不陌生了,你有各种手段处理,比如多进程,多线程,IO 复用 + 单/多线程。但是 UDP 处理并发,如果不仔细思考一下,可能你会觉得这没什么嘛,还不是和 TCP 差不多...

q1007729991 ⋅ 02/04 ⋅ 0

真心 求教 关于安卓 网络编程 多线程的 socket通信的问题

想提高自己 就想了解关于 安卓的 网络编程 多线程 以及 socket通讯等 网络编程 我就了解各http get post请求 还是登陆注册的那种,,,想了解关于请求服务器JSON数据的东西 多线程 会一个 ne...

阿逸多 ⋅ 2015/06/04 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 36分钟前 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部