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

UDP协议原理图解:

UDP协议:需要借助于InetAddress来获取设备的IP地址,以及姓名

 import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException; public class InetAddressDemo {
public static void main(String[] args) throws IOException {
// InetAddress address = InetAddress.getByName("10.129.123.23");
InetAddress address = InetAddress.getByName("ooo-PC");
// InetAddress address = InetAddress.getByName("lpp-PC"); // 获取该ip地址对象的IP地址和主机名
String name = address.getHostName();
String ip = address.getHostAddress(); System.out.println(name);
System.out.println(ip);
}
}
 /*
* 网络通讯三要素:
* 1.IP地址:InetAddress 网络中设备的标识,不易记忆,可用主机名;
* 2.端口号:用于标识进程的逻辑地址,不同进程的标识传输协议通讯的规则;用于标识进程的逻辑地址,不同进程的标识,
* 有效端口:0~65535,其中0~1024系统使用或保留端口。
* 3.常见协议:TCP,UDP。
*/ /*
* UDP协议
* 将数据源和目的封装成数据包中,不需要建立连接;
* 每个数据报的大小在限制在64k;
* 因无连接,是不可靠协议;
* 不需要建立连接,速度快
*/ /*
* Socket套接字:
* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的 标识符套接字。
* Socket原理机制:通信的两端都有Socket。
* 网络通信其实就是Socket间的通信。
* 数据在两个Socket间通过IO传输。
*/ //第一部分代码是接收端,一般是先开接收端的代码,再开发送端
//接收端代码的创建步骤如下:
/*
* UDP协议接收数据:
* 1.创建接收端socket对象
* 2.创建一个数据包(接收数据的容器)
* 3.调用socket的对象的接收方法接收数据
* 4.解析数据,并显示在控制台
* 5.释放资源
*/ import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; /*
* 对于里面创建对象的部分进行优化直接链式编程
* java.net.BindException: Address already in use: Cannot bind
* 该端口已经被使用了,有可能是第二次调用或者第一次调用的时候该端口被其它程序使用。
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端数socket对象,指定端口。
DatagramSocket ds = new DatagramSocket(10086);
// 接收数据
byte[] buf = new byte[1024];
// int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); // 将接受的数据放进dp数据报包中
// 解析数据,获取IP地址以及数据报包中的内容
// InetAddress address = dp.getAddress();
// String ip = address.getHostAddress();
// byte[] bys = dp.getData();
// int len = dp.getLength(); // 数据报包的实际长度 String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + ":--" + s); // 释放资源
ds.close(); }
} //----------------------------------------
//下面是发送端的代码,与上面分开在两个类 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class SendDemo {
public static void main(String[] args) throws IOException {
// 发送端socket对象
DatagramSocket ds = new DatagramSocket(); // 数据打包
byte[] bys = "java".getBytes();
// int len = bys.length;
// InetAddress address = InetAddress.getByName("lpp-PC");
// int port = 10086; DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("lpp-PC"), 10086); // 发送数据
ds.send(dp); // 释放资源
ds.close();
}
}
 /*
* 多线程实现在一个代码里面姐发送又接受数据
* 在发送端从键盘录入数据,一直读到886结束数据的录入发送,键盘录入一句就接受一句,接收端一直开着等着数据的发送。
*/ //首先是main方法 import java.io.IOException;
import java.net.DatagramSocket;
import java.net.SocketException; /*
* 通过多线程
*/
public class chatRoomDemo {
public static void main(String[] args) throws IOException {
// 接收端,发送端socket
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReceive = new DatagramSocket(10086); SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReceive); // 线程开启
Thread sendThread = new Thread(st);
Thread receiverThread = new Thread(rt); sendThread.start();
receiverThread.start();
}
} //--------------------------------------------
//接收端线程的创建
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class ReceiveThread implements Runnable {
private DatagramSocket ds; public ReceiveThread(DatagramSocket ds) {
// 通过构造方法进行初始化
this.ds = ds;
} @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + "--->" + s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
} //---------------------------------------
//发送端线程的创建 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class SendThread implements Runnable {
private DatagramSocket ds; public SendThread(DatagramSocket ds) {
this.ds = ds;
} @Override
public void run() {
// TODO Auto-generated method stub
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("lpp-PC"), 10086); ds.send(dp);
}
} catch (IOException e) {
e.printStackTrace();
}
// //释放资源
// ds.close();
} }

java网络编程之UDP通讯的更多相关文章

  1. Java网络编程之UDP

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

  2. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  3. java 网络编程之UDP通信和简单的群聊程序

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. java网络编程之UDP实例

    package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { pu ...

  5. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载.   ...

  6. 网络编程之UDP编程

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

  7. Java网络编程之InetAddress浅析

    Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...

  8. Java网络编程之URLConnection

    Java网络编程之URLConnecton 一.URLConnection简介 URLConnection是一个抽象类,表示指向URL指定资源的活动连接.URLConnection有两个不同但相关的用 ...

  9. Java网络编程之URL和URI

    Java网络编程之URL与URI 一.URL与URI简介 URI = Universal Resource Identifier 统一资源标志符 URL = Universal Resource Lo ...

随机推荐

  1. WPF基础知识、界面布局及控件Binding

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  2. JBOSS /invoker/JMXInvokerServlet 利用工具 .

    链接: http://pan.baidu.com/s/1F8bMI 密码: 1h2r 工具使用说明 1. 查看系统名称 java -jar jboss_exploit_fat.jar -i http: ...

  3. Linux是怎么启动的

    按下电源按钮的直到欢迎页出来之后,linux总共做的事可以分为五步来完成. 1. BIOS加电自检: 加电自检,检测硬件设备.然后按照cmos上面的顺序来搜索处在活动状态下的可以引导的设备.可以是光驱 ...

  4. Request.url请求路径的一些属性

    Request.url请求路径的一些属性1,Request.UrlReferrer.AbsolutePath=获取URL的绝对路径例:"/Manager/Module/OfficialMan ...

  5. loadview 方法调用

    从官方文档看 不应该直接调用此方法,当控制器当前的view为空的时候,这个方法就会被调用,并且会创建一个空白的view,如果viewcontroller绑定了storyboard或者xib就不用说了. ...

  6. ios网络_json数据解析

    网络上数据传输以json或者xml格式. json是字典 或者 数组 或者字典跟数组嵌套的形式.解析json就是把json反序列化(解析)---把json转换为oc对象.json序列化就是把oc对象转 ...

  7. 从零开始攻略PHP(4)——数组的使用

    1.数组的概念 数组就是一个用来存储一系列变量值的命名区域. 每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素. PHP允许间隔性地使用数字或字符串作为数组的索引. 2.数字索引数组 ...

  8. 源码安装zabbix

    源码安装zabbix 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.     欢迎加入:高级运维工程师之路 598432640 前言:参考网上多篇源码安装的连接,自己把安装过程丢在这 ...

  9. SQL 启动服务方法

    (1)windows开始菜单->Microsoft SQL Server 2012->配置工具->配置管理器

  10. 20145207《Java程序设计》第6周学习总结

    教材学习内容总结 一.输入/输出 InputStream与Outputstream • 串流设计的概念 从应用程序角度看,将数据从来源取出,可以使用输入串流,将数据写入目的地,可以使用输出串流:在Ja ...