UDP简介

  • UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据报。在OSI模型中,UDP位于第四层——传输层,处于IP协议额上一层。UDP有不提供数据报分组、组装以及不能对数据报排序的缺点。当报文发送之后,是无法得知其是否安全完整到达的。

  • 由于UDP不属于连接性协议的特性,因此具有资源消耗小、处理速度快的优点,所以通过音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响,如人们聊天使用的ICQ和OICQ使用的就是UDP协议。

  • 使用java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。下面就对这两个类进行案例介绍

利用UDP通信功能,用DatagramPacket类与DatagramSocket类的常用方法,模拟实现一个功能完善的聊天程序。

1、实现聊天窗口界面,首先创建一个名称为ChatRoom的程序入口类,在该类的main()方法中获取当前服务所在端口号、聊天对象服务所在端口号,并创建DatagramSocket信息收发对象,以及通过多线程实现发送端和接收端功能,如下图所示:

相关代码

import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Scanner; public class ChatRoom {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
System.out.print("请输入聊天服务当前启动端口号:");
int serverPort = sc.nextInt();
System.out.print("请输入聊天服务发送信息对象的目标端口号:");
int targetPort = sc.nextInt();
System.out.println("聊天系统初始化完成并启动!!!");
try {
DatagramSocket socket = new DatagramSocket(serverPort);
new Thread(new ChatReceiver(socket), "接收服务").start();
new Thread(new ChatSend(socket,targetPort),"发送服务").start();
} catch (SocketException e) {
e.printStackTrace();
}
}
}

2、实现聊天程序接收信息功能。创建一个ChatReceiver类作为聊天程序的接收端,用于接收其他用户发送的聊天信息。如下图所示:

相关代码

import java.net.DatagramPacket;
import java.net.DatagramSocket; public class ChatReceiver implements Runnable {
private DatagramSocket server;
public ChatReceiver(DatagramSocket server) {
this.server = server;
}
public void run() {
try {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
while (true) {
server.receive(packet);
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println("收到" + packet.getAddress()+":"+packet.getPort()+ " 发送的数据:" + str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

3、实现聊天程序发送信息功能。创建一个ChatSend类,作为聊天程序的发送端,用于向指定的聊天程序发送聊天信息。具体如下图:

相关代码

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner; public class ChatSend implements Runnable {
private DatagramSocket client;
private int targetPort;
public ChatSend(DatagramSocket client,int targetPort) {
this.client = client;
this.targetPort = targetPort;
}
public void run() {
try {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
while (true) {
String data = sc.nextLine();
byte[] buf = data.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length,
InetAddress.getByName("127.0.0.255"),targetPort);
client.send(packet);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

4.、执行程序,查看结果。编写完所有类后,执行ChatRoom类中的main()方法,启动成功后.先单击控制台右侧工具栏上的[Pin Console]按钮锁定当前窗口,然后再通过Eelipse控制台右侧工具栏上的[Open Console]按钮下拉框选择[New Console View1新建一个Consle窗口,再次运行main()方法,具体操作过程如下图所示:

5、执行结果如下图:

最新文章

  1. 【代码笔记】iOS-钢琴小游戏
  2. angular随笔
  3. Python error: ascii’/'utf-8′ codec can’t decode byte 0xb8 in position 50: ord
  4. 黑马程序员——JAVA基础之语法、命名规则
  5. ABAP - 日期格式转换 & ABAP经常使用日期处理函数
  6. Hash table in PowerShell
  7. 兼容ie7以上的 placeholder属性
  8. Retrofit,Okhttp对每个Request统一动态添加header和参数(五)
  9. App 被拒 -- App Store Review Guidelines (2015)中英文对照
  10. 【Java入门提高篇】Day16 Java异常处理(上)
  11. 【BZOJ2117】 [2010国家集训队]Crash的旅游计划
  12. STM32F103 ------ 时钟配置
  13. WMware虚拟机中连接ios真机
  14. spring揭密学习笔记
  15. JS学习笔记3_函数表达式
  16. Linux下安装SQL Server 2016(安装篇SQL Server on linux)
  17. hibernate注解(三)1+N问题
  18. 常见linux内核线程说明
  19. Effective C++学习笔记(1)
  20. 爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存

热门文章

  1. uni-app获取dom元素到顶部的距离以及操作dom元素的一些样式
  2. mysql数据库之多表查询
  3. iptables 删除规则
  4. 非常优秀的Javascript(AJAX) 开发工具:Aptana
  5. python命令之m参数 局域网传输
  6. 解析xml的方式
  7. JS获取手机型号和系统
  8. Element-ui学习笔记3--Form表单(三)
  9. JavaScript 全国级省市县联动
  10. Android Button点击效果(按钮背景变色、文字变色)