一、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图片剪辑插件 React图片剪辑插件

    React图片剪辑插件: https://github.com/roadmanfong/react-cropper React图片剪辑插件: https://github.com/xyxiao001/ ...

  2. pycharm的使用(day03复习整理)

    pycharm的使用 file --> settings --> editor -->general --> change font size .... file --> ...

  3. 设计模式C++描述----13.代理(Proxy)模式

    一. 举例说明 我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示. 这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模 ...

  4. Scrapy 实现爬取多页数据 + 多层url数据爬取

    项目需求:爬取https://www.4567tv.tv/frim/index1.html网站前三页的电影名称和电影的导演名称 项目分析:电影名称在初次发的url返回的response中可以获取,可以 ...

  5. 这一次,终于系统的学习了 JVM 内存结构

    最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...

  6. linux centos ubutun svn搭建

    1.卸载SVN 查看自己是否安装了svn svn 上图显示已安装,可用以下命令进行卸载 sudo apt-get remove --purge subversion (–purge 选项表示彻底删除改 ...

  7. jsp一句话木马

    <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*"%> <%!Str ...

  8. JavaSE语法(中)

    6.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递.Java语言的方法调用支持参数的值传递.当一个对象实例作为一个 ...

  9. 使用Typescript重构axios(十三)——让响应数据支持泛型

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  10. PHP常用的header头部定义

    <?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...