Java基于UDP协议实现简单的聊天室程序_java

最近比较闲,一直在抽空回顾一些Java方面的技术应用。
今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序。
现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆。 

先看一下效果:

 

实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理。
 “聊天室001”的用户,小红和小绿相互聊了两句,“聊天室002”的小黑无人理会,在一旁寂寞着。 

看一下代码实现: 

1、首先是消息服务器的实现,功能很简单:
•将客户端的信息(进入了哪一个聊天室等)进行登记; 
•构造UDP协议套接字对象,接受各个客户端发送的消息;
•解析消息内容,将聊天信息推送回对应聊天室的各个客户端;

package com.tsr.simplechat.receive_server;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;

import com.google.gson.Gson;
import com.tsr.simplechat.bean.MessageEntity;
import com.tsr.simplechat.client.ChatClient;

//聊天服务器
public class ChatServer extends Thread {
 // 程序占用端口号
 private static final int PORT = 10000;
 // 消息接受套接字对象
 private static DatagramSocket server = null;
 // 字典对象(Key:聊天室ID,Value:该聊天室下的客户端用户集合);
 private static HashMap<String, ArrayList<ChatClient>> groups = new HashMap<String, ArrayList<ChatClient>>();

 // 构造器
 public ChatServer() {
 try {
  // 消息接受套接字对象的构造初始化
  server = new DatagramSocket(PORT);
 } catch (SocketException e) {
  e.printStackTrace();
 }
 }

 // 注册聊天室新登录用户
 public static void logInGroup(String groupID, ChatClient client) {
 // 通过聊天室ID,获取该聊天室的所有在线用户
 ArrayList<ChatClient> clients = groups.get(groupID);
 if (clients == null) {
  clients = new ArrayList<ChatClient>();
 }
 // 将此次进入聊天室的用户登记
 clients.add(client);
 // 更新聊天室信息
 groups.put(groupID, clients);
 }

 // 循环接收消息
 @Override
 public void run() {
 while (true) {
  receiveMessage();
 }
 }

 private void receiveMessage() {
 // UDP数据包
 byte[] buf = new byte[1024];
 DatagramPacket packet = new DatagramPacket(buf, buf.length);
 while (true) {
  try {
  // 接受数据包
  server.receive(packet);
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }

  // 解析数据包,获取聊天信息
  String content = new String(packet.getData(), 0, packet.getLength());

  // 通过第三方包解析json数据
  Gson gson = new Gson();
  MessageEntity me = gson.fromJson(content, MessageEntity.class);

  // 解析消息内容,通过聊天室ID,获取该聊天室的所有在线用户
  ArrayList<ChatClient> clients = groups.get(me.getGroupId());

  // 将接收到的消息推送回该聊天室的各个用户
  for (ChatClient client : clients) {
  client.pushBackMessage(me);
  }
 }
 }
}

 2、客户端程序,依然很简单:

•简单的定义客户端聊天室界面。
•构造消息发送套接字对象。
•获取聊天信息框的内容,发送到服务器。

 package com.tsr.simplechat.client;

import java.awt.Button;
import java.awt.Event;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import com.tsr.simplechat.bean.MessageEntity;
import com.tsr.simplechat.receive_server.ChatServer;

//客户端程序
public class ChatClient extends Frame {
 private static final long serialVersionUID = 1L;
 // 聊天室ID
 private String groupID;
 // 客户端用户名
 private String clientName;
 // 客户端消息发送服务套接字
 private DatagramSocket msg_send;
 // 服务端口
 private final int PORT = 10000;
 // 服务器IP地址
 private InetAddress ip;

 // 客户端控件
 TextField tf = new TextField(20);
 TextArea ta = new TextArea();
 Button send = new Button("send");

 // 客户端构造器
 public ChatClient(String groupID, String clientName) {

 super("聊天室:" + groupID + "/" + clientName);
 this.clientName = clientName;
 this.groupID = groupID;
 // 设置客户端界面样式
 add("North", tf);
 add("Center", ta);
 add("South", send);
 setSize(250, 250);
 show();
 // 聊天相关服务器初始化
 init();

 // 监视器
 addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
  // 关闭消息发送服务
  msg_send.close();
  // 关闭客户端程序
  dispose();
  System.exit(0);
  }
 });

 }

 // 聊天相关服务器初始化
 private void init() {
 // 注册当前用户及所在聊天室信息注册到服务器
 ChatServer.logInGroup(groupID, this);
 try {
  // 初始化消息发送套接字对象
  msg_send = new DatagramSocket();
  // 指定消息服务器
  try {
  ip = InetAddress.getByName("127.0.0.1");
  } catch (UnknownHostException e) {
  System.out.println("未知的主机异常..");
  }
 } catch (SocketException e) {
  System.out.println("套接字连接异常..");
 }
 }

 // 消息发送按钮时间监听
 public boolean action(Event evt, Object arg) {
 if (evt.target.equals(send)) {
  try {
  // 获取输入内容
  String content = tf.getText();
  // 发送消息
  send_message(content);
  // 清空聊天框
  tf.setText(null);
  } catch (Exception ioe) {
  System.out.print(ioe.getMessage());
  }
 }
 return true;
 }

 // 消息发送
 private void send_message(String content) {
 // 消息格式化(json格式)
 String message = messageFormat(content);
 // 将消息封装成UDP数据包
 byte[] buf = message.getBytes();
 DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, PORT);

 try {
  // 通过UDP协议发送消息
  msg_send.send(packet);
 } catch (IOException e) {
  System.out.println("IO异常..");
 }
 }

 // 消息格式化
 private String messageFormat(String content) {
 StringBuffer buffer = new StringBuffer();
 buffer.append("{\"groupId\":").append("\"").append(groupID).append(
  "\",");
 buffer.append("\"userName\":\"").append(clientName).append("\",");
 buffer.append("\"text\":\"").append(content).append("\"}");

 return buffer.toString();

 }

 // 从服务器获取当前聊天室最新消息(回调..)
 public void pushBackMessage(MessageEntity me) {
 ta.append(me.getUserName() + ":" + me.getText());
 ta.append("\n");

 }
}

 3、消息实体类
 主要就是用于将消息封装成对象,包含:聊天室ID、消息发送者昵称,消息内容。使用json格式解析。

 package com.tsr.simplechat.bean;

//消息实体
public class MessageEntity {
 private String groupId;
 private String userName;
 private String text;

 public String getGroupId() {
 return groupId;
 }

 public void setGroupId(String groupId) {
 this.groupId = groupId;
 }

 public String getUserName() {
 return userName;
 }

 public void setUserName(String userName) {
 this.userName = userName;
 }

 public String getText() {
 return text;
 }

 public void setText(String text) {
 this.text = text;
 }

}

 

 4、OK,到了这里就基本搞定了,建立一个测试类。

•开启消息服务器。
•开启三个客户端,其中两个进入“聊天室001”,另一个进入“聊天室002”。

 import com.tsr.simplechat.client.ChatClient;
import com.tsr.simplechat.receive_server.ChatServer;

public class Test {
 public static void main(String[] args) {
 ChatServer r = new ChatServer();
 r.start();

 ChatClient c1 = new ChatClient("001", "小红");
 ChatClient c2 = new ChatClient("001", "小绿");
 ChatClient c3 = new ChatClient("002", "小黑");
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
udp聊天室
jsp实现简单聊天室、js实现简单聊天室项目、java实现通信协议udp、tcp ip协议栈简单实现、udp聊天室,以便于您获取更多的相关知识。

时间: 2024-10-24 08:26:20

Java基于UDP协议实现简单的聊天室程序_java的相关文章

udp-需要一个java基于UDP协议的文件传输程序

问题描述 需要一个java基于UDP协议的文件传输程序 文件是一个实验数据的文件,是txt个格式的,需要将它传输到指定的IP上 解决方案 server package com.way.server;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundEx

基于Tomcat7、Java、WebSocket的服务器推送聊天室实例_java

前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大部分采用的都是"轮询"和"长连接"技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSoc

ASP.NET 使用application与session对象写的简单聊天室程序_实用技巧

ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览器端的变量对象,用来存储跨网页程序程序的变量或者对象.  说实话,写了快一年的asp.net,application对象还真没怎么用过.看了看书,根据这两个对象的特性写了一个简单的聊天室程序.真的是非常的简陋. 我的思路是,有两个页面Default页和ChatRoom页,页面布局如图: Defaul

计算机网络课设之基于UDP协议的简易聊天机器人

前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C语言的socket编程我基本没有接触过,顶多对java网络编程有一点涉猎.下面我将自己所学的知识做了一个总结,希望可以对想要去接触socket(网络)编程的同学有一个帮助,当然想要学好网络编程肯定是离不开几本书的支撑的,这篇文章主要通过一个机器人聊天的案例帮大家入下门. 注意:想要成功运行的前提条件

基于UDP协议的语音聊天系统的设计与实现

问题描述 基于UDP协议的语音聊天系统的设计与实现 系统架构为C/S模式.能登陆.查找.添加好友,先后与2个以上好友语音聊天.服务端存储信息. 解决方案 你可以去学习一下 XMPP 解决方案二: 你这个模型,要是局域网就好说,一个收一个发,开个UDP持续监听就可以,但是要是通外网,那你就要好好学习下,以下几个软件,mqtt,pjsip.不然你做出来的东西可能很难用.

Flex和java的socket通信(四)一个简单的聊天室

服务端:java jdk1.5 使用工具:eclipse3.2 客户端:使用工具flex 2 目的:做一个简单的聊天室,用来实现消息广播. 服务端: 客户端:

与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 作者:webabcd 介绍与众不同 windows phone 7.5 (sdk 7.1) 之通信 实例 - 基于 Socket UDP 开发一个多人聊天室 示例1.服务端Main.cs /* *

java mp4 拖拽 播放-java基于http协议的 mp4视频 的拖拽播放 ,java后台的

问题描述 java基于http协议的 mp4视频 的拖拽播放 ,java后台的 想做一个mp4视频实时拖拽播放的一个功能,求思路或可行例子!

Java基于Tcp协议的socket编程实例_java

本文实例讲述了Java基于Tcp协议的socket编程方法,分享给大家供大家参考.具体分析如下: 以下是一对一的通信编程实现,后续会继续学习一个服务器监听多个客户端的实现. 这里用到的主要步骤如下: 第一步:以特定端口(如4800)新建socket对象 第二步:以系统输入设备构造BufferedReader对象,该对象用于接收系统键盘输入的字符 第三步:以socket对象 得到输出流来构造PrintWriter 第四步:以socket对象得到输入流来构造相应的BufferedReader对象,该