/**
 * 在java中网络通讯也称作为Socket(套接字)通讯,要求通讯的两台机器都必须安装Socket
 * 不同的协议有不同的Socket
 * 
 * UDP通讯协议的特点:
 * 1.将数据及其原源和目的封装为数据包,不需要建立连接
 * 2.每个数据包大小限制在64k
 * 3.因为无连接,所以不可靠
 * 4.因为不需要建立连接,所以速度快
 * 5.UDP通讯是不分服务端与客户端的,只分发送端与接收端
 * 如:人说话、CS等
 * 
 * TCP通讯协议的特点:
 * 1.面向连接,有特有的通道
 * 2.在连接中传输大数据量
 * 3.通过三次握手机制连接,可靠协议
 * 4.通信前必须建立连接,效率稍低
 * 如:打电话、文件的传送
 * 
 * UDP协议下的Socket:
 * DatagramSocket(UDP插座服务)
 *  DatagramPacket(数据包类)
 *   DatagramPacket(buf, length, address, port)
 *     buf:发送的是数据内容
 *     length:发送数据内容大小
 *       address:发送的目的IP地址对象
 *       pprt:端口号
 *

* */

一、实现接收端接收数据,发送端发送数据

package com.shuhuadream.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//UDP 接收端 接收数据
public class MyReceiver {public static void main(String[] args) {try {//1.创建接收端对象DatagramSocket socket = new DatagramSocket(6565);//2.创建byte数组容器,封装为数据包用于存放数据byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf,buf.length);//3.调用UDP的服务接收数据socket.receive(packet);//receive是一个阻塞方法,没有接收到数据一直继续等待,数据实际上就是存储到了byte的字节数组中//4.处理数据System.out.println("发送端传来的数据:"+new String(buf,0,packet.getLength()));//5.关闭资源socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
package com.shuhuadream.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;//UDP 发送端 发送数据
public class MySender {public static void main(String[] args) {try {//1.创建发送端发送对象DatagramSocket socket = new DatagramSocket(7777);//2.准备数据,并将数据封装到数据包内String msg = "生当作人杰,死亦为鬼雄";byte[] data = msg.getBytes();DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),6565);//3.调用udp服务发送数据包socket.send(packet);//4.关闭资源--实际上是释放占用的端口号socket.close();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

运行结果:

二、实现发送端单项多次给接收端发送信息

package com.shuhuadream.udp;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;//发送端
public class ChatSender {public static void main(String[] args) {try {//创建发送端对象DatagramSocket socket = new DatagramSocket(2443);//明确要发送的数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));while(true){String line = br.readLine();byte[] data = line.getBytes();//将数据打包DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getByName("10.41.151.14"),6565);//发送数据socket.send(packet);if(line.equals("bye")){break;}}//关闭发送端资源br.close();socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
package com.shuhuadream.udp;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//接收端
public class ChatReceiver {public static void main(String[] args) {try {//1.创建接收端对象DatagramSocket socket = new DatagramSocket(6565);//2.创建byte数组容器,封装为数据包用于存放数据byte[] buf = new byte[1024];while(true){DatagramPacket packet = new DatagramPacket(buf,buf.length);//3.调用UDP的服务接收数据socket.receive(packet);//4.处理数据System.out.println(packet.getAddress().getHostAddress()+":"+new String(packet.getData(),0,packet.getLength()));}
//          //5.关闭资源
//          socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

三、开启线程实现两个客户端之间能够聊天

package com.shuhuadream.udp2;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPSendThread extends Thread{private DatagramSocket socket;    //发送端对象private InetAddress address; //目标地址private int port;             //端口号public UDPSendThread(DatagramSocket socket, InetAddress address, int port) {super();this.socket = socket;this.address = address;this.port = port;}public void run() {//获取要发送的数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));while(true){try {String line = br.readLine();byte[] data = line.getBytes();//将数据打包DatagramPacket packet = new DatagramPacket(data,data.length,address,port);//发送数据socket.send(packet);} catch (IOException e) {e.printStackTrace();}}}
}
package com.shuhuadream.udp2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPReceiverThread extends Thread{private DatagramSocket socket;//接收端对象public UDPReceiverThread(DatagramSocket socket) {super();this.socket = socket;}@Overridepublic void run() {while(true){//准备容器,封装为数据包用于存放数据byte[] buf = new byte[1024*16];DatagramPacket packet = new DatagramPacket(buf,buf.length);try {//接收数据socket.receive(packet);//处理数据System.out.println(packet.getAddress().getHostAddress()+":"+new String(packet.getData(),0,packet.getLength()));} catch (IOException e) {e.printStackTrace();}}}
}

接下来两个客户端都开启接收和发送线程

客户端一:

package com.shuhuadream.udp2;import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class UDPClient01 {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(8888);InetAddress address = InetAddress.getByName("10.41.151.14");//创建发送、接收线程UDPSendThread sendThread = new UDPSendThread(socket, address, 4444);UDPReceiverThread receiverThread = new UDPReceiverThread(socket);//开启线程sendThread.start();receiverThread.start();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();}}
}

客户端二:

package com.shuhuadream.udp2;import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;public class UDPClient02 {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(4444);InetAddress address = InetAddress.getByName("10.41.151.63");//创建发送、接收线程UDPSendThread sendThread = new UDPSendThread(socket, address, 8888);UDPReceiverThread receiverThread = new UDPReceiverThread(socket);//开启线程sendThread.start();receiverThread.start();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();}}
}

实验效果图:

Java之网络编程(二)UDP相关推荐

  1. 【Java】网络编程——TCP/UDP网络对讲机

    目录 前言 OSI概述 传输层 端口 Socket InetAddress类 UDP协议间的通信 UDP协议相关类 UDP 发送端 UDP 接收端 + 发送端 UDP 聊天 + 全局广播 UDP发送大 ...

  2. Java网络编程(二) 连续发送数据

    有了建立连接的基础后,接下来尝试连续地发送和接收数据. 对于发送端比较好理解,有数据时就可以发送出去.对于接收端,就需要一直监听是否有数据发送过来.一个基本的方法就是使用 while(true) 循环 ...

  3. Java的网络编程【TCP与UDP聊天小程序】

    Java的网络编程[TCP与UDP聊天小程序] 1. TCP协议 1.1 传输控制协议(Transmission Control Protocol),是一种**面向连接(全程保持连接)**的协议,类似 ...

  4. 【零基础学Java】—网络编程(五十三)

    [零基础学Java]-网络编程(五十三) 一.软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构,常见的程序有QQ.迅雷等软件 B/S:全称为Browser/Serve ...

  5. 2022Java学习笔记八十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)

    2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现) 一.快速入门 DatagramPacket:数据包对象 实例代码 定义发送端 package com.zcl.d ...

  6. Java(网络编程)

    Java(网络编程) 参考视频:1.什么是计算机网络(狂神) 1. 概述 地球村 TCP:打电话 UDP:发短信 计算机网络: 计算机网络是指将地理位置不同的,具有独立功能的,多台计算机及其外部设备, ...

  7. java学习-网络编程

    一.前期配置:安装tomcat服务器 现代的应用程序都离不开网络,网络编程是非常重要的技术.Java SE提供java.net包,其中包含了网络 编程所需要的最基础一些类和接口.这些类和接口面向两个不 ...

  8. Netty:Java 领域网络编程的王者

    一.简介 1. 课程背景 分布式系统的根基在于网络编程,而 Netty 是 Java 领域网络编程的王者. 2. 课程内容 第一部分 NIO 编程,三大组件 第二部分 Netty 入门学习,Event ...

  9. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  10. 你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识

    一步一步走来,之前去学习了JUC并发编程知识,现在终于到Java IO网络编程啦,难啊. 一.BIO介绍 引入: 随着技术的发展,两个或以上的程序必然需要进行交互,于是提供了一种端到端的通信,相当于对 ...

最新文章

  1. Java 修饰符的总结
  2. 15个可交互的真实房屋场景,Silvio/李飞飞组开源大型室内场景的模拟环境iGibson...
  3. python练习题-99乘法表
  4. Lichee (六) 优化配置的微内核
  5. python自动操作微信_Python+Appium 自动化操作微信入门看这一篇就够了
  6. TCP为什么是四次挥手
  7. 使用iBatis数据映射框架吧
  8. python数组内运算_有效的数学运算在Python中用cython进行小数组运算
  9. Android 应用开发(37)---RelativeLayout(相对布局)
  10. 谷歌修复安卓System 组件中的多个 RCE 漏洞
  11. Linux系统下的RZSZ(文件传输工具)
  12. Word 中插入 C/C++ 代码(转)
  13. Android 圆角的效果实现
  14. Ubuntu10.10下ftp的安装配置
  15. CTFSHOW WEB 1-100
  16. 微信公众平台中怎么上传附件?
  17. 如何学习stm32,怎么学习stm32,不是仅仅看教程,照着写复制代码
  18. 【读书笔记】AMBA 2 AHB、AMBA 3 AHB(AHB_Lite)和AMBA 5 AHB协议比较
  19. appium 模拟手机所有操作 牛皮 无敌
  20. Netty与SpringBoot整合

热门文章

  1. CA数字证书是什么?
  2. 万事开头难,开启博客之路
  3. tcp-ip网络模型-物理层
  4. 总结解决 No suitable driver found for jdbc:mysql//localhost:3306/ 问题的解决方案,各种情况都已囊括,希望可以帮助到有需要的各位
  5. 正则表达式实现与或非
  6. indesign选中不了图片删除_文件夹删除不了怎么办?文件夹删除不了的解决方法...
  7. [渝粤教育] 西南科技大学 语文教材教法 在线考试复习资料2021版
  8. AI会玩魔方了!全是自学,比任何人都快,包括机器人
  9. 地理信息系统(GIS) 知识详解
  10. 美团套餐榜、商家榜数据抓取