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协议的更多相关文章

  1. java 25 - 4 网络编程之 UDP协议传输的代码优化

    UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...

  2. java 25 - 4 网络编程之 UDP协议传输思路

    UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...

  3. python六十八课——网络编程之UDP协议

    1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...

  4. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

  5. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  6. Java网络编程之UDP

    Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...

  7. 网络编程之TCP协议与UDP协议

    了解网络就要了解一些基本的协议今天主要跟大家分享一些关于TCP 协议UDP协议的相关知识 首先介绍一下TCP协议 TCP(Transmission Cintrol Protocol)可靠的.面向连接的 ...

  8. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  9. (28)网络编程之UDP

    介绍UDP通信协议的编程之前,先介绍一下网络编程,socket相关的概念: 网络编程:网络编程主要用于解决计算机与计算机(手机平板等)之间的数据传输问题. 网络编程:不需要基于html网页就可以达到数 ...

随机推荐

  1. 本地或者是koala软件编译less文件为css

    背景: 事情的起因是这般的,平时工作是在线上办公,样式是使用less来写,于是乎,这样我从线上download下来的less文件无法直接在自己的本地环境运行.有一个问题就是我要把less文件先编译成c ...

  2. js与java通信

    js 调用java中的接口并传递参数给客户端处理方式: webView.addJavascriptInterface(new NewsDetail() , "newsDetail" ...

  3. create tablespace 与 heap_insert 函数

    先说 heap_insert 函数: /* * heap_insert - insert tuple into a heap * * The new tuple is stamped with cur ...

  4. Codeforces Round #268 (Div. 1) A. 24 Game 构造

    A. 24 Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/468/problem/A D ...

  5. [Bootstrap] 4. Typogrphy

    What is Typography When we talk about typography, it's a big subject! Which of the following fall un ...

  6. Spring(AbstractRoutingDataSource)实现动态数据源切换--转载

    原始出处:http://linhongyu.blog.51cto.com/6373370/1615895 一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目 ...

  7. codereview介绍

    1. 定义: Code review is systematic examination (often known as peer review) of computer source code. I ...

  8. USB HID usage table

    This usage table lets usbhidctl decode the HID data correctly for the APC RS/XS1000's. This work was ...

  9. 设置su和sudo为不需要密码

    设置su和sudo为不需要密码 一 设置sudo为不需要密码   有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替.默认新建的用户不在sudo组, ...

  10. IPC:shared memory

    #include <stdio.h> #include <sys/shm.h> #include <sys/stat.h> int main () { int se ...