一、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的网络编程(发送消息及回复)的更多相关文章

  1. TCP与UDP在socket编程中的区别 (网络收集转载)

    http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  ...

  2. 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述

    我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...

  3. 三十天学不会TCP,UDP/IP网络编程-UDP,从简单的开始

    如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)star我的这一系列文章,虽然说现在这种 ...

  4. 三十天学不会TCP,UDP/IP网络编程 - 绅士的开始

    经过了过年的忙碌和年初的懈怠一切的日子,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到. 如果对和程序员有关 ...

  5. TCP/UDP Linux网络编程详解

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...

  6. 三十天学不会TCP,UDP/IP网络编程 - UDP的实践--DHCP

    在经历了一顿忙碌加出去玩了玩之后,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到,在gitbook的后台流量 ...

  7. TCP与UDP在socket编程中的区别

    一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  UDP程序结构较简单  流模式与数据报模式  TCP保证数据正确性,UDP可能丢包  TCP保证数据顺序,UD ...

  8. 【socket】TCP 和 UDP 在socket编程中的区别

    一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  UDP程序结构较简单  流模式与数据报模式  TCP保证数据正确性,UDP可能丢包  TCP保证数据顺序,UD ...

  9. TCP 和 UDP 在socket编程中的区别(转)

    一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  UDP程序结构较简单  流模式与数据报模式  TCP保证数据正确性,UDP可能丢包  TCP保证数据顺序,UD ...

随机推荐

  1. vue入门笔记(新手入门必看)

    一.什么是Vue? 1.    vue为我们提供了构建用户界面的渐进式框架,让我们不再去操作dom元素,直接对数据进行操作,让程序员不再浪费时间和精力在操作dom元素上,解放了双手,程序员只需要关心业 ...

  2. Python之路(第四十篇)进程池

    一.进程池 进程池也是通过事先划分一块系统资源区域,这组资源区域在服务器启动时就已经创建和初始化,用户如果想创建新的进程,可以直接取得资源,从而避免了动态分配资源(这是很耗时的). 线程池内子进程的数 ...

  3. The usage of Markdown---表格

    更新时间:2019.09.14   谈到怎么在Markdown中插入表格,其实只要熟知以下几点就可以了: 使用管道符|进行内容的分割 使用冒号:和连号符-表示表格内容的对齐情况,连号符-在中间,冒号: ...

  4. 前端jsp联系项目相关经验

    ——引语 总算是有时间将我这几个月总结下了  前面都是总结的比较凌乱.希望这次好好组织语言 接触到前端js时还是比较陌生的了,因为之前一直用的zk来进行开发的,不过稍稍提下总能记起一些来,对比以前用的 ...

  5. Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象

    作用 Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象. 语法 Object.assign(target, ...sources) 参数 ta ...

  6. 委托事件(jQuery)

    <div class="content"> <ul> <li>1</li> <li>2</li> <l ...

  7. OptimalSolution(4)--字符串问题(2)进阶

    一.将整数字符串转成整数值 二.判断字符数组中是否所有的字符都只出现过一次 三.在有序但含有空的数组中查找字符串 四.数组中两个字符串的最小距离 五.添加最少字符使字符串整体都是回文字符串 六.括号字 ...

  8. 【ASP.NET Core学习】Razor页面

    准备工作 初始化空的项目(终端输入:dotnet new web -n=Razor) Nuget添加Microsoft.EntityFrameworkCore.SqlServer 和 Microsof ...

  9. docker 概念简介、简单入门

    1.docker 简介 Docker 是一个开源项目,这个项目旨在通过把应用程序打包为可移植的.自给自足的容器(引用语) DocKer一次构建可放在任何地方就可以运行,不需要进行任何改变DocKer  ...

  10. MUI 混合开发移动app应用开发 --- app版本升级

    当我们的app开发完成之后,无可避免的以后会进行产品升级,那么我们希望在客户的手机上让app进行自动升级,可以分为自动升级和手动升级. 自动升级:一般在客户app第一次打开首页的时候. 手动升级:在a ...