tcp和udp的网络编程(发送消息及回复)
一、UDP 无连接的 高效的 基于数据报的 不可靠 的连接
主要的应用场景:
需要资源少,网络情况稳定的内网,或者对于丢包不敏感的应用,比如 DHCP 就是基于 UDP 协议的。
不需要一对一沟通,建立连接,而是可以广播的应用。因为它不面向连接,所以可以做到一对多,承担广播或者多播的协议。
需要处理速度快,可以容忍丢包,但是即使网络拥塞,也毫不退缩,一往无前的时候
基于 UDP 的几个例子
直播。直播对实时性的要求比较高,宁可丢包,也不要卡顿的,所以很多直播应用都基于 UDP 实现了自己的视频传输协议
实时游戏。游戏的特点也是实时性比较高,在这种情况下,采用自定义的可靠的 UDP 协议,自定义重传策略,能够把产生的延迟降到最低,减少网络问题对游戏造成的影响
物联网。一方面,物联网领域中断资源少,很可能知识个很小的嵌入式系统,而维护 TCP 协议的代价太大了;另一方面,物联网对实时性的要求也特别高。比如 Google 旗下的 Nest 简历 Thread Group,推出了物联网通信协议 Thread,就是基于 UDP 协议的
服务器端:
//服务器端
try {
DatagramSocket ds= new DatagramSocket();
//
byte [] b= new byte[];
DatagramPacket dp= new DatagramPacket(b, b.length);
ds.receive(dp);
System.out.println("客户端说:"+new String(dp.getData(),,dp.getData().length)); //回复客户端消息 要回复的地址 原来的包裹上都有
//要定义 包裹的大小 和邮寄的地址
String str= "我去洗澡了";
SocketAddress address = dp.getSocketAddress();
DatagramPacket dp1= new DatagramPacket(str.getBytes(), str.getBytes().length, address);
ds.send(dp1);
//关闭资源。。。。。
ds.close(); } catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
客户端:
//udp 就很类似于我们生活中的发快递
try {
//
DatagramSocket ds= new DatagramSocket();
// 要发的包裹 str
String str="在吗?";
//选择快递地址
InetAddress address = InetAddress.getByName("localhost");
//填写快递单 (要传输的报文的byte 数组 以及起始的位置 结束的位置 地址)
DatagramPacket dp= new DatagramPacket(str.getBytes(), , str.getBytes().length, address, );
//发送包裹
ds.send(dp); //接受服务器返回的 报文数据
byte [] b= new byte[];
DatagramPacket dp1= new DatagramPacket(b, b.length);
ds.receive(dp1);
System.out.println("服务器说:"+new String(dp1.getData(),,dp1.getData().length)); ds.close(); } catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
TCP:可靠的连接 面向连接 基于流 效率相对较低 安全
// 服务器端要先向设备申请端口号 以便接受客户端的数据流
ServerSocket ss = null;
Socket s = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
ss = new ServerSocket();
s = ss.accept();
inputStream = s.getInputStream();
byte[] b = new byte[inputStream.available()];
int len = ;
while ((len = inputStream.read(b)) != -) {
System.out.println(new String(b, , len));
} // 向客户端回应下
outputStream = s.getOutputStream();
outputStream.write("我要去洗澡了".getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
if (s != null) {
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//客户端
Socket s = null;
OutputStream outputStream = null;
InputStream inputStream =null;
try {
s = new Socket("localhost", );
outputStream = s.getOutputStream();
outputStream.write("在?".getBytes());
// outputStream.flush(); //关闭套接字
s.shutdownOutput();
//接受服务端的回应
inputStream = s.getInputStream();
BufferedReader bb= new BufferedReader(new InputStreamReader(inputStream));
String readLine = bb.readLine();
System.out.println(readLine); //下边的代码有问题 死循环 // byte [] b= new byte[1024];
// int len =0;
// while ((len= inputStream.read(b))!=-1) {
// System.out.println(new String(b, 0, len));
// }
inputStream.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
if (s != null) {
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
面试:
两者的区别
- TCP 是面向连接的,UDP 是面向无连接的
- UDP程序结构较简单
- TCP 是面向字节流的,UDP 是基于数据报的
- TCP 保证数据正确性,UDP 可能丢包
- TCP 保证数据顺序,UDP 不保证
TCP 为什么是可靠连接
- 通过 TCP 连接传输的数据无差错,不丢失,不重复,且按顺序到达。
- TCP 报文头里面的序号能使 TCP 的数据按序到达
- 报文头里面的确认序号能保证不丢包,累计确认及超时重传机制
- TCP 拥有流量控制及拥塞控制的机制
tcp和udp的网络编程(发送消息及回复)的更多相关文章
- TCP与UDP在socket编程中的区别 (网络收集转载)
http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) ...
- 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述
我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...
- 三十天学不会TCP,UDP/IP网络编程-UDP,从简单的开始
如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)star我的这一系列文章,虽然说现在这种 ...
- 三十天学不会TCP,UDP/IP网络编程 - 绅士的开始
经过了过年的忙碌和年初的懈怠一切的日子,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到. 如果对和程序员有关 ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- 三十天学不会TCP,UDP/IP网络编程 - UDP的实践--DHCP
在经历了一顿忙碌加出去玩了玩之后,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到,在gitbook的后台流量 ...
- TCP与UDP在socket编程中的区别
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
- 【socket】TCP 和 UDP 在socket编程中的区别
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
- TCP 和 UDP 在socket编程中的区别(转)
一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UD ...
随机推荐
- Android应用程序版本升级时签名冲突
这种错误特别容易在调试中出现,原因是你手机上的应用是直接用eclipse或者android studio安装的,而eclipse或者android studio有自己默认的签名:**debug.key ...
- js 的隐式转换与显式转换
隐式转换 1.undefined与null相等,但不恒等(===) 2.一个是number一个是string时,会尝试将string转换为number 3.隐式转换将boolean转换为numbe ...
- JavaScript中instanceof的判断依据
读jquery源码的时候,发现作者为了让创建jquery对象更容易使用了用函数返回对象的方法 jQuery = function( selector, context ) { return new j ...
- 转:redis-cli 命令总结
redis-cli常用命令,原文地址:https://maoxian.de/2015/08/1342.html Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些comm ...
- fastjson自由:controller上指定active profile,让你想序列化什么字段就序列化什么字段
一.前言 最近有个需求,其实这个需求以前就有,比如定义了一个vo,包含了10个字段, 在接口A里,要返回全部字段: 但是在接口B里呢,需要复用这个 vo, 但是只需要返回其中8个字段. 可能呢,有些同 ...
- android 7.0 pm install 失败问题
这两天,把app内置成系统文件或者系统签名取得系统权限,发现使用pm install path在低版本上可行,在高版本就安装失败 抛出 NullPointException,查看了一下源码,发现对包名 ...
- 0818NOIP模拟测试25——B卷简记
幸亏考场上没考这个,T1结论T2不会T3板子.估计会死的更惨 T1是学长讲过的Cat变式,沿直线y=x+1翻折方案数相减,现推,15分钟弄出来没什么问题. 只要不要把m,n读反就行. T3是个tarj ...
- Maven多模块项目介绍和搭建
http://www.open-open.com/lib/view/open1418263515855.html
- 使用FinalShell 安装jdk和tomcat流程(Linux系统是centOS7.5)
本文是作者原创,版权归作者所有.若要转载,请注明出处 我今天刚刚买了一个一年的百度云服务器,85元,还是很便宜的,正好用来练练linux,至于为什么使用FinalShell 而不是xshell,因为F ...
- python学习之【第十六篇】:Python中的常用模块之OS模块、sys模块、random模块
1. OS模块 OS模块是与操作系统交互的一个接口.内部提供了以下方法: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname& ...