java UDP实现一个聊天工具的示例代码

 更新时间:2021年01月18日 09:39:36   作者:中二病没有蛀牙  
这篇文章主要介绍了java UDP实现一个聊天工具的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

题目:
假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。具体如下:
(1)、Tom和Jerry聊天的双方都应该具有发送端和接收端;
(2)、利用DatagramSocket与DatagramPacket;
(3)、实现 java.lang.Runnable类,重写 run()方法。

在这里插入图片描述

学过计网的都知道,利用三元组(ip地址,协议,端口)就可以标识网络的进程了。
而进行通信我们直接运用socket就可以了,首先需要知道是socket是什么,这部分可以参考这个大佬写的博客。
https://www.jb51.net/article/121601.htm
实现一个客户端,那么需要Tom和Jerry都可以实现接收和发送功能,分别用两个线程启动。

接收线程Receive_Thread.java

package Chat_UDP;

import java.io.IOException;
import java.util.Date;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.text.SimpleDateFormat;

public class Receive_Thread extends Thread {
 private static final int MAX_RECEIVE_BUFFER = 1024;
 private DatagramSocket server;
 private DatagramPacket packet;
 byte[] buffer = new byte[MAX_RECEIVE_BUFFER];
 
 public Receive_Thread(DatagramSocket server)
 {
  this.server = server;
  packet = new DatagramPacket(buffer, buffer.length);
 }
 
 @Override
 public void run() {
  try
  {
   while(true)
   {
    //接收数据包
    server.receive(packet);
    String s = new String(packet.getData(),packet.getOffset(),packet.getLength(),"UTF-8");
    Date day=new Date(); 
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    if(packet.getPort() == 10001)
    	System.out.println("Tom"+packet.getAddress()+" 说:"+s+"\t"+df.format(day));
    else{
    	System.out.println("Jerry"+packet.getAddress()+" 说 :"+s+"\t"+df.format(day));
    }
    packet.setLength(buffer.length);
   }
  }
  catch(IOException e)
  {
   System.out.println("IOException");
  }
 }
}

发送线程Send_Thread.java

package Chat_UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class Send_Thread extends Thread{
 //发送的socket端
 private DatagramSocket sender = null;
 //待发送的目标地址
 private InetSocketAddress address = null;
 //从键盘输入
 Scanner scan = new Scanner(System.in);
 public Send_Thread(DatagramSocket sender,InetSocketAddress address)
 {
  this.sender = sender;
  this.address = address;
 }
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try
  {
   while(true)
   {
    //输入待发送的内容
    String input = scan.nextLine();
    if(input.equals("exit"))
     break;
    byte[] data = null;
    data = input.getBytes("UTF-8");
    //创建UDP数据报
    DatagramPacket pack = new DatagramPacket(data, data.length,address);
    sender.send(pack); 
   }
   System.out.println("Exit!");
   
  }catch(IOException e)
  {
   System.out.println("IOException");
  }
 }

}

聊天服务器
Chat_Server.java

package Chat_UDP;
//杨丽冰 201831064402
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Chat_Server {

 private static final int DEST_PORT = 8888;
 private static final int SEND_PORT = 10001;
 private static final int RECE_PORT = 9000;
 private static final String IP = "127.0.0.1";

 public static void main(String[] args)
 {
  try{
   Send_Thread send_thread = null;
   Receive_Thread rece_thread = null;
   InetSocketAddress address = null;
   //创建待接受数据包的目的机的端口号和IP地址
   address = new InetSocketAddress(IP, DEST_PORT);
   //创建发送的Socket端
   DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
   //创建接受的Socket端
   DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
   //发送线程建立
   send_thread = new Send_Thread(sendsocket, address);
   //接受线程的建立
   rece_thread = new Receive_Thread(recesocket);
   send_thread.start();
   rece_thread.start();
  }catch(Exception e)
  {
   System.out.println("Exception!");
  }

 }

}

聊天客户端 Chat_Client.java

package Chat_UDP;
//杨丽冰 201831064402
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Chat_Client {
	//声明端口号
 private static final int DEST_PORT = 9000;
 private static final int SEND_PORT = 10000;
 private static final int RECE_PORT = 8888;
 private static final String IP = "127.0.0.1";

 public static void main(String[] args)
 {
  try{
   Send_Thread send_thread = null;
   Receive_Thread rece_thread = null;
   InetSocketAddress address = null;
   //创建待接受数据包的目的机的端口号和IP地址
   address = new InetSocketAddress(IP, DEST_PORT);
   //创建发送的Socket端
   DatagramSocket sendsocket = new DatagramSocket(SEND_PORT);
   //创建接受的Socket端
   DatagramSocket recesocket = new DatagramSocket(RECE_PORT);
   //发送线程建立
   send_thread = new Send_Thread(sendsocket, address);
   //接受线程的建立
   rece_thread = new Receive_Thread(recesocket);
   send_thread.start();
   rece_thread.start();

  }catch(Exception e)
  {
   System.out.println("Exception!");
  }

 }

}

需要注意的时候运行的时候需要同时运行聊天服务器和客户端,才能够正常运行。
最终效果如下:

在这里插入图片描述
在这里插入图片描述

到此这篇关于java UDP实现一个聊天工具的文章就介绍到这了,更多相关java UDP聊天工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 快速上手Java中的Properties集合类

    快速上手Java中的Properties集合类

    java.util.Properties集合继承于Hashtable,来表示一个持久的属性集,他使用键值结构存储数据,每个键及其对应的值都是一个字符串,该类被许多java类使用,下面这篇文章主要给大家介绍了关于如何快速上手Java中Properties集合类的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java深入分析动态代理

    Java深入分析动态代理

    动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在程序运行时根据需要动态的创建目标类的代理对象。本文将通过案例详细讲解一下Java动态代理的原理及实现,需要的可以参考一下
    2022-07-07
  • SpringCloud集成Sleuth和Zipkin的思路讲解

    SpringCloud集成Sleuth和Zipkin的思路讲解

    Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以及解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现,这篇文章主要介绍了SpringCloud集成Sleuth和Zipkin,需要的朋友可以参考下
    2022-11-11
  • springboot集成spring cache缓存示例代码

    springboot集成spring cache缓存示例代码

    本篇文章主要介绍了springboot集成spring cache示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • IDEA消除指定警告的两种方法小结

    IDEA消除指定警告的两种方法小结

    有时候IDEA会代码中给出一些我们不需要的警告,看起来就很不美观,本文主要介绍了IDEA消除指定警告的两种方法,感兴趣的可以了解一下
    2023-08-08
  • ActiveMQ消息队列技术融合Spring过程解析

    ActiveMQ消息队列技术融合Spring过程解析

    这篇文章主要介绍了ActiveMQ消息队列技术融合Spring过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MyBatis实现万能Map和模糊查询

    MyBatis实现万能Map和模糊查询

    本文主要介绍了MyBatis实现万能Map和模糊查询,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 如何使用 IntelliJ IDEA 编写 Spark 应用程序(Scala + Maven)

    如何使用 IntelliJ IDEA 编写 Spark 应用程序(Sc

    本教程展示了如何在IntelliJIDEA中使用Maven编写和运行一个简单的Spark应用程序(例如WordCount程序),本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 如何从Java环境中调用GoLang函数

    如何从Java环境中调用GoLang函数

    Go,常被称为GoLang,Go语言凭借其丰富的标准库,以及 goroutines和 channels等独特特性,在开发可扩展且高效的程序方面展现了显著优势,许多开发者倾向于将Go与其他编程语言结合使用,在本文中,我们将深入探讨如何从Java环境中调用GoLang函数,以实现两种语言的无缝集成
    2025-01-01
  • java数据库连接池新手入门一篇就够了,太简单了!

    java数据库连接池新手入门一篇就够了,太简单了!

    数据库连接池负责分配、管理和释放数据库连接,释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏,这项技术能明显提高对数据库操作的性能
    2021-06-06

最新评论