• Java网络编程——UDP聊天程序


    UDP简介

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

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

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

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

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

    相关代码

    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类作为聊天程序的接收端,用于接收其他用户发送的聊天信息。如下图所示:
    02

    相关代码

    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类,作为聊天程序的发送端,用于向指定的聊天程序发送聊天信息。具体如下图:
    03

    相关代码

    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()方法,具体操作过程如下图所示: 04

    5、执行结果如下图:

    05

    欢迎查阅
  • 相关阅读:
    mysqlsla 分析mysql慢查询日志
    MyBatis-DynamicSQL 动态SQL
    MyBatis-resultType 与 resultMap 中的几种返回类型
    MyBatis-${}与#{}
    MyBatis-parameterType 入参封装 Map 流程
    MyBatis-parameterType 取出入参值
    MyBatis-CURD
    第二十四篇-用VideoView制作一个简单的视频播放器
    第二十三篇-ubuntu18.04怎么下载播放器以及如何设置默认播放器
    第二十二篇-Guideline基准线
  • 原文地址:https://www.cnblogs.com/gh110/p/12158125.html
Copyright © 2020-2023  润新知