网络编程之UDP协议
UDP协议
UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
提到无连接数据传输,那我们首先想到的就是不可靠,数据丢失等等,那么在我们的日常软件中,UDP协议到底都应用在什么场景上呢?举一个大家比较熟悉的例子,就是我们平时所用的聊天软件,因为我们的聊天软件所传输的数据并非是重要数据。
通过ip和端口号,我们可以实现一个小的聊天软件,有兴趣的朋友可以在局域网内通过该软件聊天,安全无插件。好了 废话不多说,我们直接上代码:
//发送端
public class UdpSend { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
System.out.println("请输入聊天语句:");
String name = input.next();
byte[] b = name.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress
.getByName("192.168.15.80"), 10000);
ds.send(dp);
ds.close();
}
}
//接收端
public class UdpReceive {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket ds = new DatagramSocket(10000);
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println(data);
}
}
我用的是MyEclipse写的代码,有兴趣的童鞋直接粘过去就能用,但是使用时大家会发现一个很明显的缺点,就是只能发送或接受一次程序就运行结束了,这样要怎么解决呢?我的解决方案是在外侧套上一个while(true)的循环,通过条件判断何时退出程序,听起来很简单,可是在加循环的时候要注意一点,就是位置问题,要特别注意的是不能将所有代码一股脑的放到循环中,因为DatagramSocket对象如果放到循环中,那么下次循环执行时就不再是同一对象。正确修改代码如下:
//发送端
public class UdpSend { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
DatagramSocket ds = new DatagramSocket();
while (true) {
System.out.println("请输入聊天语句:");
String name = input.next();
byte[] b = name.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress
.getByName("192.168.0.3"), 10000);
ds.send(dp);
if (name.equals("结束")) {
break;
}
}
ds.close();
}
}
//接收端
public class UdpReceive { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket ds = new DatagramSocket(10000);
while (true) {
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println(data);
}
}
}
这样一个可以一直在局域网内聊天的小程序就完成了。因为UDP的不可靠性,数据包在传输时会发生跳变,可能发生不可预知的错误。
网络编程之UDP协议的更多相关文章
- java 25 - 4 网络编程之 UDP协议传输的代码优化
UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...
- java 25 - 4 网络编程之 UDP协议传输思路
UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...
- python六十八课——网络编程之UDP协议
1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- 网络编程之TCP协议与UDP协议
了解网络就要了解一些基本的协议今天主要跟大家分享一些关于TCP 协议UDP协议的相关知识 首先介绍一下TCP协议 TCP(Transmission Cintrol Protocol)可靠的.面向连接的 ...
- java网络编程之UDP通讯
详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...
- (28)网络编程之UDP
介绍UDP通信协议的编程之前,先介绍一下网络编程,socket相关的概念: 网络编程:网络编程主要用于解决计算机与计算机(手机平板等)之间的数据传输问题. 网络编程:不需要基于html网页就可以达到数 ...
随机推荐
- springMVC get请求及其请求地址写法
今天,需要写一个接口,写完之后,测试的时候发线一直报404错误,不知道为什么报错.应该是get请求地址的问题,get请求有两个参数,改为一个参数的时候是好用的,可能那种方式不适合写两个参数的get请求 ...
- CentOS下系统时间同步和时区的修改和设置(用的这个)
一.修正时区 rm -rf /etc/localtime #删除当前默认时区www.kwx.gd ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localt ...
- SCOM2012端口需求
Agent push requirements (including firewall ports): The account being used to push the agent must ha ...
- Codeforces Round #324 (Div. 2) B. Kolya and Tanya 快速幂
B. Kolya and Tanya Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/pro ...
- Linux性能及调优指南(翻译)之Linux内存架构
http://blog.csdn.net/ljianhui/article/details/46734115
- .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)
.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二) .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一) 上一篇主 ...
- Ⅰ.Spring的点点滴滴--序章
spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 .net篇(环境为vs2012+Spring.Core.dll) 新建一个控制台 using Spring.Context; ...
- c++中io流的使用
#include <strstream> #include <iostream.h> #include <string> using namespace std; ...
- failed to obtain a cell from its dataSource
stroyboard没有绑定标示 没有注册标示 cell为空时没有创建
- GCC生成的汇编代码
假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y){ int t = x + y; accum += t; return ...