一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java基于UDP協議實現簡單的聊天室程序

Java基于UDP協議實現簡單的聊天室程序

2020-05-29 14:16ghost_Programmer JAVA教程

這篇文章主要為大家詳細介紹了Java基于UDP協議實現簡單的聊天室程序的相關資料,感興趣的小伙伴們可以參考一下

最近比較閑,一直在抽空回顧一些Java方面的技術應用。
今天沒什么事做,基于UDP協議,寫了一個非常簡單的聊天室程序。
現在的工作,很少用到socket,也算是對Java網絡編程方面的一個簡單回憶。 

先看一下效果:

Java基于UDP協議實現簡單的聊天室程序

實現的效果可以說是非常非常簡單,但還是可以簡單的看到一個實現原理。
 “聊天室001”的用戶,小紅和小綠相互聊了兩句,“聊天室002”的小黑無人理會,在一旁寂寞著。 

看一下代碼實現: 

1、首先是消息服務器的實現,功能很簡單:
•將客戶端的信息(進入了哪一個聊天室等)進行登記; 
•構造UDP協議套接字對象,接受各個客戶端發送的消息;
•解析消息內容,將聊天信息推送回對應聊天室的各個客戶端;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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、客戶端程序,依然很簡單:

•簡單的定義客戶端聊天室界面。
•構造消息發送套接字對象。
•獲取聊天信息框的內容,發送到服務器。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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格式解析。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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”。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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教程java觀感示例分享

    java觀感示例分享

    這篇文章主要介紹了java觀感示例,該實例查詢并生成了系統中存在觀感對應的按鈕并在用戶點擊相應按鈕時將窗口的觀感切換到指定的觀感上 ...

    java技術網1282019-11-12
  • JAVA教程java中數組list map三者之間的互轉介紹

    java中數組list map三者之間的互轉介紹

    java中 數組 list map之間的互轉一張圖清晰呈現并附有代碼,不懂的朋友可以參考下 ...

    java教程網4332019-10-17
  • JAVA教程linux下執行java程序的sh腳本分享

    linux下執行java程序的sh腳本分享

    這篇文章主要介紹了linux下執行java程序的sh腳本,僅供參考,但是設置的時候環境變量是最重要的,我就是環境變量一直不對,總是按網上查到的來,不明...

    hebedich1402019-11-29
  • JAVA教程java制作復制文件工具代碼分享

    java制作復制文件工具代碼分享

    如果目標位置沒有同名文件,則直接拷貝過去;如果目標位置已有同名文件,則比對文件的最后修改日期,來進行覆蓋或者忽略。程序會在可以在復制過程...

    java技術網1252019-11-04
  • JAVA教程Java操作Mysql的方法

    Java操作Mysql的方法

    這篇文章主要介紹了Java操作Mysql的方法,實例分析了Java針對有返回結果和沒有返回結果的sql操作的相關技巧,需要的朋友可以參考下 ...

    yongh7013182019-12-09
  • JAVA教程Java開發人員需知的十大戒律

    Java開發人員需知的十大戒律

    這篇文章主要介紹了Java開發人員需知的十大戒律,較為詳細的總結分析了Java開發中常見的注意事項與編程技巧,需要的朋友可以參考下 ...

    jerry1432020-01-12
  • JAVA教程使用Rhino讓java執行javascript的方法實例

    使用Rhino讓java執行javascript的方法實例

    這篇文章主要介紹了java使用Rhino執行javascript的方法,Rhino由Mozilla開發,是 JavaScript 一種基于Java的實現 ...

    java教程網5102019-10-23
  • JAVA教程Java操作MongoDB模糊查詢和分頁查詢

    Java操作MongoDB模糊查詢和分頁查詢

    這篇文章主要介紹了Java操作MongoDB模糊查詢和分頁查詢的相關資料,需要的朋友可以參考下 ...

    java教程網2602020-04-22
主站蜘蛛池模板: 无人在线视频高清免费播放 | 国产草 | 99美国热 | 睡男神的这件小事小说在线阅读 | 538精品视频在线观看 | 精品一区二区三区 不卡高清 | 午夜大片在线观看 | 日本免费一区二区三区 | 国产精品高清一区二区三区不卡 | 天堂a视频| 精品无人区乱码1区2区3区在线 | 国产精品极品 | 成人国产网站v片免费观看 成人国产精品视频 | 久久久精品成人免费看 | 洗濯屋し在线观看 | 国产专区视频在线观看 | 偷拍综合网 | 国产精品香蕉一区二区三区 | 黑人双渗透 | 5x社区发源地最新地址 | 五月天国产视频 | 日韩欧美精品一区二区 | 亚洲色图亚洲色图 | 欧美精品亚洲精品日韩1818 | 亚洲AV综合99一二三四区 | 国产成人免费高清激情明星 | www.男人天堂 | 美女黄a| 亚洲 欧美 国产 在线 日韩 | 精品一产品大全 | www.尤物在线 | 精品国产欧美一区二区三区成人 | 香蕉97超级碰碰碰免费公 | bdsm中国精品调教 | 国产果冻传媒 | 四虎国产成人亚洲精品 | 黄动漫车车好快的车车a | 日本一区二区免费在线 | 精品在线看 | 国产欧美日韩精品在线 | 亚洲国产精品一在线观看 |