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


学过计网的都知道,利用三元组(ip地址,协议,端口)就可以标识网络的进程了。
而进行通信我们直接运用socket就可以了,首先需要知道是socket是什么,这部分可以参考这个大佬写的博客。
https://blog.csdn.net/pashanhu6402/article/details/96428887
实现一个客户端,那么需要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);}@Overridepublic 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;}@Overridepublic void run() {// TODO Auto-generated method stubtry{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实现一个聊天工具相关推荐

  1. 基于UDP的P2P聊天工具——0.2

    基于UDP的P2P聊天工具 0.2 简介: 1)这也是一个windows的P2P聊天工具: 2)它修复了0.1版的一个bug: 3)它为0.3版做了一点准备: 相关内容: 1)如果对端端口未开启服务, ...

  2. 基于UDP的P2P聊天工具 0.3——消息队列和重传

    基于UDP的P2P聊天工具 0.3--消息队列和重传 简介: 1)这是一个Windows的P2P聊天工具: 2)相比0.2,它多了定时重传的机制: 3)对局域网来说有些鸡肋,就当是为跨局域网做准备吧: ...

  3. SpringBoot写一个聊天工具

    一.简介 这是一款基于 JS 实现的超轻量级桌面版聊天软件.主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket.也支持web网页聊天实现.文字聊天,互传文件,离线消息 ...

  4. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  5. Java实现仿QQ聊天工具的项目总结

    在写这篇文章之前,首先要感谢我的队友的辛勤付出,没有他们的付出与配合,这个项目是不能顺利完成的. 资源文件:工程文件,可运行JAR包 第一点 经验:项目开始之前应该先向老师或者学长先询问经验.或者到网 ...

  6. [源码和文档分享]基于java 的仿QQ聊天工具

    一 需求分析 本系统是基于java开发的聊天室.有用户注册.用户登陆.修改密码.忘记密码.添加好友.用户聊天.群聊功能.如果服务器还没有启动,则客户端是不可以登陆.注册.忘记密码,如果在运行过程中,服 ...

  7. java 聊天室开源_用java WebSocket做一个聊天室

    最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结 ...

  8. java 仿qq庅_[源码和文档分享]基于java 的仿QQ聊天工具

    一 需求分析 本系统是基于java开发的聊天室.有用户注册.用户登陆.修改密码.忘记密码.添加好友.用户聊天.群聊功能.如果服务器还没有启动,则客户端是不可以登陆.注册.忘记密码,如果在运行过程中,服 ...

  9. Java学习系列(十七)Java面向对象之开发聊天工具

    TCP通信: Socket --相当于"虚拟链路两端的插座".Socket负责完成通信. ServerSocket --它只负责"接收"连接.它用于产生Sock ...

最新文章

  1. 使用Spring 3的@value简化配置文件的读取
  2. LA3644简单并查集判环
  3. 一个简易实用的web权限管理模块的应用与实现
  4. nginx lua 小项目:根据 user_agent 显示不同的页面,附带和 php 性能的对比
  5. SAP采购中形成的差异
  6. IPFS: Merkle DAG数据结构
  7. HDU - 6194 string string string(后缀数组+RMQ+容斥)
  8. Codeforces 934C - A Twisty Movement
  9. phpstorm 不能选择 php language level
  10. 国密祖冲之算法ZUC之Python实现
  11. 如何在Linux中考硬盘数据,Linux硬盘文件数据粉碎
  12. 前端 如何检测到当前的网页已经退出_如何监控网页崩溃?
  13. PDF有口令密码怎么移除?
  14. Nature重磅综述;关于机器学习应用单细胞组学+RNA-seq,你想知道的都在这
  15. 三星S5P6818移植工程
  16. 4个快速美白牙齿小偏方
  17. Qt多功能计算器(二)——三角函数
  18. 三菱FX系列控制步进电机回原点方向
  19. C/C++基础 isfinite()函数
  20. The Sybil Attak 女巫攻击 论文翻译

热门文章

  1. android 酷炫加载动画,一款非常简单酷炫的LoadingView动画效果
  2. 微信小程序 - 设置input只能输入数字
  3. 开发者应该知道的 6 个 JSON 工具,提高效率杠杠的
  4. mysql只比较年月_只比较日期和月份与MySQL中的日期字段?
  5. SQL Server2008函数
  6. python少儿编程书_Python少儿趣味编程
  7. SAP-期初数据导入-LTMC运用
  8. linux按修改时间排序
  9. (HYSBZ - 2038)小Z的袜子(hose)(莫队)
  10. c语言面试题——内存划分