国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

香港云服务器
服務(wù)器之家 - 編程語言 - JAVA教程 - Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序

Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序

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

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

最近比較閑,一直在抽空回顧一些Java方面的技術(shù)應(yīng)用。
今天沒什么事做,基于UDP協(xié)議,寫了一個(gè)非常簡單的聊天室程序。
現(xiàn)在的工作,很少用到socket,也算是對Java網(wǎng)絡(luò)編程方面的一個(gè)簡單回憶。 

先看一下效果:

Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序

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

看一下代碼實(shí)現(xiàn): 

1、首先是消息服務(wù)器的實(shí)現(xiàn),功能很簡單:
•將客戶端的信息(進(jìn)入了哪一個(gè)聊天室等)進(jìn)行登記; 
•構(gòu)造UDP協(xié)議套接字對象,接受各個(gè)客戶端發(fā)送的消息;
•解析消息內(nèi)容,將聊天信息推送回對應(yīng)聊天室的各個(gè)客戶端;

?
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;
 
//聊天服務(wù)器
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>>();
 
 // 構(gòu)造器
 public ChatServer() {
 try {
  // 消息接受套接字對象的構(gòu)造初始化
  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>();
 }
 // 將此次進(jìn)入聊天室的用戶登記
 clients.add(client);
 // 更新聊天室信息
 groups.put(groupID, clients);
 }
 
 // 循環(huán)接收消息
 @Override
 public void run() {
 while (true) {
  receiveMessage();
 }
 }
 
 private void receiveMessage() {
 // UDP數(shù)據(jù)包
 byte[] buf = new byte[1024];
 DatagramPacket packet = new DatagramPacket(buf, buf.length);
 while (true) {
  try {
  // 接受數(shù)據(jù)包
  server.receive(packet);
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 
  // 解析數(shù)據(jù)包,獲取聊天信息
  String content = new String(packet.getData(), 0, packet.getLength());
 
  // 通過第三方包解析json數(shù)據(jù)
  Gson gson = new Gson();
  MessageEntity me = gson.fromJson(content, MessageEntity.class);
 
  // 解析消息內(nèi)容,通過聊天室ID,獲取該聊天室的所有在線用戶
  ArrayList<ChatClient> clients = groups.get(me.getGroupId());
 
  // 將接收到的消息推送回該聊天室的各個(gè)用戶
  for (ChatClient client : clients) {
  client.pushBackMessage(me);
  }
 }
 }
}

 2、客戶端程序,依然很簡單:

•簡單的定義客戶端聊天室界面。
•構(gòu)造消息發(fā)送套接字對象。
•獲取聊天信息框的內(nèi)容,發(fā)送到服務(wù)器。

?
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;
 // 客戶端消息發(fā)送服務(wù)套接字
 private DatagramSocket msg_send;
 // 服務(wù)端口
 private final int PORT = 10000;
 // 服務(wù)器IP地址
 private InetAddress ip;
 
 // 客戶端控件
 TextField tf = new TextField(20);
 TextArea ta = new TextArea();
 Button send = new Button("send");
 
 // 客戶端構(gòu)造器
 public ChatClient(String groupID, String clientName) {
 
 super("聊天室:" + groupID + "/" + clientName);
 this.clientName = clientName;
 this.groupID = groupID;
 // 設(shè)置客戶端界面樣式
 add("North", tf);
 add("Center", ta);
 add("South", send);
 setSize(250, 250);
 show();
 // 聊天相關(guān)服務(wù)器初始化
 init();
 
 // 監(jiān)視器
 addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
  // 關(guān)閉消息發(fā)送服務(wù)
  msg_send.close();
  // 關(guān)閉客戶端程序
  dispose();
  System.exit(0);
  }
 });
 
 }
 
 // 聊天相關(guān)服務(wù)器初始化
 private void init() {
 // 注冊當(dāng)前用戶及所在聊天室信息注冊到服務(wù)器
 ChatServer.logInGroup(groupID, this);
 try {
  // 初始化消息發(fā)送套接字對象
  msg_send = new DatagramSocket();
  // 指定消息服務(wù)器
  try {
  ip = InetAddress.getByName("127.0.0.1");
  } catch (UnknownHostException e) {
  System.out.println("未知的主機(jī)異常..");
  }
 } catch (SocketException e) {
  System.out.println("套接字連接異常..");
 }
 }
 
 // 消息發(fā)送按鈕時(shí)間監(jiān)聽
 public boolean action(Event evt, Object arg) {
 if (evt.target.equals(send)) {
  try {
  // 獲取輸入內(nèi)容
  String content = tf.getText();
  // 發(fā)送消息
  send_message(content);
  // 清空聊天框
  tf.setText(null);
  } catch (Exception ioe) {
  System.out.print(ioe.getMessage());
  }
 }
 return true;
 }
 
 // 消息發(fā)送
 private void send_message(String content) {
 // 消息格式化(json格式)
 String message = messageFormat(content);
 // 將消息封裝成UDP數(shù)據(jù)包
 byte[] buf = message.getBytes();
 DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, PORT);
 
 try {
  // 通過UDP協(xié)議發(fā)送消息
  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();
 
 }
 
 // 從服務(wù)器獲取當(dāng)前聊天室最新消息(回調(diào)..)
 public void pushBackMessage(MessageEntity me) {
 ta.append(me.getUserName() + ":" + me.getText());
 ta.append("\n");
 
 }
}

 3、消息實(shí)體類
 主要就是用于將消息封裝成對象,包含:聊天室ID、消息發(fā)送者昵稱,消息內(nèi)容。使用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;
 
//消息實(shí)體
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,到了這里就基本搞定了,建立一個(gè)測試類。

•開啟消息服務(wù)器。
•開啟三個(gè)客戶端,其中兩個(gè)進(jìn)入“聊天室001”,另一個(gè)進(jìn)入“聊天室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", "小黑");
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
  • JAVA教程java觀感示例分享

    java觀感示例分享

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

    java技術(shù)網(wǎng)1282019-11-12
  • JAVA教程java中數(shù)組list map三者之間的互轉(zhuǎn)介紹

    java中數(shù)組list map三者之間的互轉(zhuǎn)介紹

    java中 數(shù)組 list map之間的互轉(zhuǎn)一張圖清晰呈現(xiàn)并附有代碼,不懂的朋友可以參考下 ...

    java教程網(wǎng)4332019-10-17
  • JAVA教程linux下執(zhí)行java程序的sh腳本分享

    linux下執(zhí)行java程序的sh腳本分享

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

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

    java制作復(fù)制文件工具代碼分享

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

    java技術(shù)網(wǎng)1252019-11-04
  • JAVA教程Java操作Mysql的方法

    Java操作Mysql的方法

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

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

    Java開發(fā)人員需知的十大戒律

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

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

    使用Rhino讓java執(zhí)行javascript的方法實(shí)例

    這篇文章主要介紹了java使用Rhino執(zhí)行javascript的方法,Rhino由Mozilla開發(fā),是 JavaScript 一種基于Java的實(shí)現(xiàn) ...

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

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

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

    java教程網(wǎng)2602020-04-22
952
主站蜘蛛池模板: 婷婷久 | 876av国产精品电影 | 国产精品久久久久久久久久久久冷 | 日韩欧美国产一区二区三区 | 99精品久久 | 亚洲欧美日韩精品 | 高清一区二区三区 | 久久中文字幕网 | 天天干天天射天天操 | 91免费视频| 中文字幕乱码亚洲无线三区 | 青青久久久 | 在线精品国产 | 欧美日韩亚洲二区 | 天堂成人av | 国产精品二区一区二区aⅴ污介绍 | 在线一级片| 久久亚洲国产精品日日av夜夜 | 91精品久久久久久久久久 | 天堂av中文在线 | 九九精品视频观看 | 成人午夜精品久久久久久久网站 | 欧美精品久久久 | 精品久久久久久久久久 | 亚洲www啪成人一区二区 | 成人涩涩日本国产一区 | 粉嫩一区二区三区 | 人成免费在线视频 | 久久国 | 黄在线免费 | 白浆在线 | 日韩免费网站 | 久久综合一区二区三区 | 依人网站| 国产专区在线 | 亚洲欧美在线一区 | 免费看一级电影 | 国产中文字幕一区 | 国产精品久久久久久久久免费高清 | 日日操综合 | 国产成人片 |