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 ...
随机推荐
- 文本查重算法SimHash
1.介绍 爬虫采集了大量的文本数据,如何进行去重?可以使用文本计算MD5,然后与已经抓取下来的MD5集合进行比较,但这种做法有个问题,文本稍有不同MD5值都会大相径庭, 无法处理文本相似问题.另一种方 ...
- day19作业
1.什么是对象?什么是类? 对象是特征和功能的结合体 类是一系列对象相同的特征和技能的集合体 2.绑定方法的有什么特点 绑定方式是由对象来调用类内部的函数,特点是会把对象当作第一个参数传入 ...
- recovery模式差分(增量)升级小结
最近在做recovery模式下的升级,简单的总结一下. 先说说recovery模式,他是个升级小系统,有单独的kernel,通过特定的系统命令就可以进入到此系统中,选择进入正常系统的kernel还是r ...
- 彻底理解Python多线程中的setDaemon与join【配有GIF示意】
在进行Python多线程编程时, join() 和 setDaemon() 是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B. ...
- Java基础(十九)集合(1)集合中主要接口和实现类
1.Java集合框架为不同类型的集合定义了大量接口 其中,集合有两个基本接口:Collection和Map. 2.各接口的主要特征如下 (1)Collection接口:是List接口.Set接口和Qu ...
- python中基本的数据类型
基本数据类型 数据:描述衡量数据的状态 类型:不同的事物需要不同的类型存储 整型 int 定义:年龄,手机号码等是整数的数字 字符串b转化为整型b = '12'print(type(b))b = i ...
- 谁说搞Java的不能玩机器学习?
简介 机器学习在全球范围内越来越受欢迎和使用. 它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增加的)部分. 没有什么包装且机器学习并不简单. 它对许多人 ...
- [2018-01-12] laravel中的MVC
路由里面可以做所有事情,但是真正的项目当中,路由只用来接收请求,并转发给控制器的方法进行处理 首先我们先了解一下 一.app/Http/routes路由的用法: 方法一. 这种方法写完后在控制器创建方 ...
- [考试反思]1009csp-s模拟测试66:依旧
依旧是好一场烂一场. 依旧是那么菜. 依旧是难止颓废. 依旧是在此方仰望,幻想? 上面这段中二的东西是为了防止Parisb说我的标题与内容无关而diss我莫名其妙115的语文. 但是菜是的确是菜... ...
- Scrapy爬取豆瓣图书数据并写入MySQL
项目地址 BookSpider 介绍 本篇涉及的内容主要是获取分类下的所有图书数据,并写入MySQL 准备 Python3.6.Scrapy.Twisted.MySQLdb等 演示 代码 一.创建项目 ...