最近做了一個項目,其中有一個在線網頁交流的需求,好久沒寫代碼了,手都生疏了,于是先寫demo練練手,分享到服務器之家平臺,以此做個記錄,方便自己和大家使用。
先給大家說下實現步驟分這樣幾大步:
1、使用awt組件和socket實現簡單的單客戶端向服務端持續發送消息;
2、結合線程,實現多客戶端連接服務端發送消息;
3、實現服務端轉發客戶端消息至所有客戶端,同時在客戶端顯示;
4、把awt組件生成的窗口界面改成前端jsp或者html展示的界面,java socket實現的客戶端改為前端技術實現。
這里首先實現第一步的簡單功能,難點在于:
1、沒有用過awt組件,沒有用過java相關的監聽事件;
2、長時間沒有使用socket進行客戶端和服務端的交互,并且沒有真正進行過cs結構的開發。
實現功能的代碼如下:
客戶端:
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 chat.chat; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; /** * 在線聊天客戶端 1、生成圖形窗口界面輪廓 2、為輪廓添加關閉事件 3、在輪廓中加入輸入區域和內容展示區域 4、為輸入區域添加回車事件 * 5、建立服務端連接并發送數據 * * @author tuzongxun123 * */ public class ChatClient extends Frame { // 用戶輸入區域 private TextField tfTxt = new TextField(); // 內容展示區域 private TextArea tarea = new TextArea(); private Socket socket = null ; // 數據輸出流 private DataOutputStream dataOutputStream = null ; public static void main(String[] args) { new ChatClient().launcFrame(); } /** * 建立一個簡單的圖形化窗口 * * @author:tuzongxun * @Title: launcFrame * @param * @return void * @date May 18, 2016 9:57:00 AM * @throws */ public void launcFrame() { setLocation( 300 , 200 ); this .setSize( 200 , 400 ); add(tfTxt, BorderLayout.SOUTH); add(tarea, BorderLayout.NORTH); pack(); // 監聽圖形界面窗口的關閉事件 this .addWindowListener( new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit( 0 ); disConnect(); } }); tfTxt.addActionListener( new TFLister()); setVisible( true ); connect(); } /** * 連接服務器 * * @author:tuzongxun * @Title: connect * @param * @return void * @date May 18, 2016 9:56:49 AM * @throws */ public void connect() { try { // 新建服務端連接 socket = new Socket( "127.0.0.1" , 8888 ); // 獲取客戶端輸出流 dataOutputStream = new DataOutputStream(socket.getOutputStream()); System.out.println( "連上服務端" ); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 關閉客戶端資源 * * @author:tuzongxun * @Title: disConnect * @param * @return void * @date May 18, 2016 9:57:46 AM * @throws */ public void disConnect() { try { dataOutputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 向服務端發送消息 * * @author:tuzongxun * @Title: sendMessage * @param @param text * @return void * @date May 18, 2016 9:57:56 AM * @throws */ private void sendMessage(String text) { try { dataOutputStream.writeUTF(text); dataOutputStream.flush(); } catch (IOException e1) { e1.printStackTrace(); } } /** * 圖形窗口輸入區域監聽回車事件 * * @author tuzongxun123 * */ private class TFLister implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String text = tfTxt.getText().trim(); tarea.setText(text); tfTxt.setText( "" ); // 回車后發送數據到服務器 sendMessage(text); } } } |
服務端:
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
|
package chat.chat; import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.net.BindException; import java.net.ServerSocket; import java.net.Socket; /** * java使用socket和awt組件簡單實現在線聊天功能服務端 可以實現一個客戶端連接后不斷向服務端發送消息 * 但不支持多個客戶端同時連接,原因在于代碼中獲得客戶端連接后會一直循環監聽客戶端輸入,造成阻塞 * 以至于服務端無法二次監聽另外的客戶端,如要實現,需要使用異步或者多線程 * * @author tuzongxun123 * */ public class ChatServer { public static void main(String[] args) { // 是否成功啟動服務端 boolean isStart = false ; // 服務端socket ServerSocket ss = null ; // 客戶端socket Socket socket = null ; // 服務端讀取客戶端數據輸入流 DataInputStream dataInputStream = null ; try { // 啟動服務器 ss = new ServerSocket( 8888 ); } catch (BindException e) { System.out.println( "端口已在使用中" ); // 關閉程序 System.exit( 0 ); } catch (Exception e) { e.printStackTrace(); } try { isStart = true ; while (isStart) { boolean isConnect = false ; // 啟動監聽 socket = ss.accept(); System.out.println( "one client connect" ); isConnect = true ; while (isConnect) { // 獲取客戶端輸入流 dataInputStream = new DataInputStream( socket.getInputStream()); // 讀取客戶端傳遞的數據 String message = dataInputStream.readUTF(); System.out.println( "客戶端說:" + message); } } } catch (EOFException e) { System.out.println( "client closed!" ); } catch (Exception e) { e.printStackTrace(); } finally { // 關閉相關資源 try { dataInputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
以上所述是小編給大家介紹的Java Socket實現一個簡易在線聊天功能(一)的相關知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!