一、實(shí)驗內(nèi)容
實(shí)現(xiàn)一個簡單的聊天程序,要求能多人在線聊天。
二、實(shí)驗?zāi)康?/h5>
1、熟悉網(wǎng)絡(luò)編程的基本知識,掌握 Socket 套接字的使用。
2、加深網(wǎng)絡(luò)編程中對網(wǎng)絡(luò) TCP 協(xié)議的理解,以及采用 TCP 協(xié)議進(jìn)行的三次握手的具體過程。
3、鍛煉、學(xué)習(xí)查找相關(guān)資料來解決實(shí)際問題的實(shí)踐動手能力以及獨(dú)立解決問題的能力。
4、通過成品的制作,對理論知識的運(yùn)用,來培養(yǎng)學(xué)習(xí)興趣或者擴(kuò)展學(xué)習(xí)。
三、實(shí)驗步驟
一、實(shí)驗界面設(shè)計:
1、主要分為兩個界面:登陸界面和聊天界面。分別如下圖:
登陸界面:
登陸界面.png
聊天室界面:
聊天室界面.png
二、實(shí)驗詳細(xì)實(shí)現(xiàn)過程:
1、登陸模塊:
用戶首先注冊賬號,程序在后臺會將注冊賬號發(fā)送服務(wù)器,檢查注冊賬號是否重復(fù),若沒有同名,則登陸成功,界面跳轉(zhuǎn)到聊天界面。如果同名,彈出提示消息重新命名。
2、聊天模塊:
(1)界面組成:界面主要分為四大塊:顯示聊天記錄的文本域、發(fā)送消息的文本域、發(fā)送消息或者取消按鈕、顯示在線用戶 List 組件。
(2)功能實(shí)現(xiàn):
如何實(shí)現(xiàn)多人在線聊天?
在服務(wù)器端開啟多線程來監(jiān)聽客戶端請求,每連接一個請求,就開啟一個線程。代碼實(shí)現(xiàn)如下:
server = new ServerSocket(port);
JOptionPane.showMessageDialog(null, "服務(wù)器登陸成功!");
list = new ArrayList<String>();
map = new HashMap<String, Socket>();
while(true){
socket = server.accept();
Thread thread = new Thread(new ThreadSocket(socket));
thread.start();
}
開啟服務(wù)器,監(jiān)聽端口 port ,每接受一個請求,開啟一個 Thread ,用戶登錄成功后將用戶名存儲在 List 集合中,同時將該套接字 socket 存在 map 集合中。
服務(wù)器如何判斷用戶名同名?
每一個用戶在登陸時,在 List 集合中檢查是否同名,沒有就登陸成功,同時將新用戶添加到 List 集合中。
客戶如何進(jìn)行交互?
基本實(shí)現(xiàn)是:客戶將消息發(fā)給服務(wù)器,服務(wù)器根據(jù) map 集合將消息再轉(zhuǎn)發(fā)給其他所有用戶。代碼實(shí)現(xiàn)如下:
Set keyset = Server.map.keySet();
Iterator it = keyset.iterator();
while(it.hasNext()){
String name = (String) it.next();
if(!name.equals(userName)){
Socket clientSocket= Server.map.get(name);
sendToClient(clientSocket,message);
}
}
客戶端如何接發(fā)消息?
客戶端設(shè)置兩個線程,一個接受消息,一個發(fā)送消息。
如何動態(tài)顯示在線用戶?
服務(wù)器根據(jù) List 集合中存貯的名單發(fā)給所有客戶,客戶端接受后,通過 List Swing組件顯示。每次登陸新用戶或者用戶下線,服務(wù)器端會在 List 集合動態(tài)增減,從而動態(tài)顯示在線用戶。
3、實(shí)驗演示:
如下圖:
GIF.gif
四、實(shí)驗總結(jié):
1、熟悉網(wǎng)絡(luò)編程的基本知識,掌握 Socket 套接字的使用。
2、加深網(wǎng)絡(luò)編程中對網(wǎng)絡(luò) TCP 協(xié)議的理解,以及采用 TCP 協(xié)議進(jìn)行的三次握手的具體過程。
3、鍛煉、學(xué)習(xí)查找相關(guān)資料來解決實(shí)際問題的實(shí)踐動手能力以及獨(dú)立解決問題的能力。
4、通過成品的制作,對理論知識的運(yùn)用,來培養(yǎng)學(xué)習(xí)興趣或者擴(kuò)展學(xué)習(xí)。
一、實(shí)驗界面設(shè)計:
1、主要分為兩個界面:登陸界面和聊天界面。分別如下圖:

聊天室界面:

二、實(shí)驗詳細(xì)實(shí)現(xiàn)過程:
1、登陸模塊:
用戶首先注冊賬號,程序在后臺會將注冊賬號發(fā)送服務(wù)器,檢查注冊賬號是否重復(fù),若沒有同名,則登陸成功,界面跳轉(zhuǎn)到聊天界面。如果同名,彈出提示消息重新命名。
2、聊天模塊:
(1)界面組成:界面主要分為四大塊:顯示聊天記錄的文本域、發(fā)送消息的文本域、發(fā)送消息或者取消按鈕、顯示在線用戶 List 組件。
(2)功能實(shí)現(xiàn):
如何實(shí)現(xiàn)多人在線聊天?
在服務(wù)器端開啟多線程來監(jiān)聽客戶端請求,每連接一個請求,就開啟一個線程。代碼實(shí)現(xiàn)如下:
server = new ServerSocket(port);
JOptionPane.showMessageDialog(null, "服務(wù)器登陸成功!");
list = new ArrayList<String>();
map = new HashMap<String, Socket>();
while(true){
socket = server.accept();
Thread thread = new Thread(new ThreadSocket(socket));
thread.start();
}
開啟服務(wù)器,監(jiān)聽端口 port ,每接受一個請求,開啟一個 Thread ,用戶登錄成功后將用戶名存儲在 List 集合中,同時將該套接字 socket 存在 map 集合中。
服務(wù)器如何判斷用戶名同名?
每一個用戶在登陸時,在 List 集合中檢查是否同名,沒有就登陸成功,同時將新用戶添加到 List 集合中。
客戶如何進(jìn)行交互?
基本實(shí)現(xiàn)是:客戶將消息發(fā)給服務(wù)器,服務(wù)器根據(jù) map 集合將消息再轉(zhuǎn)發(fā)給其他所有用戶。代碼實(shí)現(xiàn)如下:
Set keyset = Server.map.keySet();
Iterator it = keyset.iterator();
while(it.hasNext()){
String name = (String) it.next();
if(!name.equals(userName)){
Socket clientSocket= Server.map.get(name);
sendToClient(clientSocket,message);
}
}
客戶端如何接發(fā)消息?
客戶端設(shè)置兩個線程,一個接受消息,一個發(fā)送消息。
如何動態(tài)顯示在線用戶?
服務(wù)器根據(jù) List 集合中存貯的名單發(fā)給所有客戶,客戶端接受后,通過 List Swing組件顯示。每次登陸新用戶或者用戶下線,服務(wù)器端會在 List 集合動態(tài)增減,從而動態(tài)顯示在線用戶。
3、實(shí)驗演示:
如下圖:

1、java語言中,加深了面向?qū)ο缶幊痰睦斫猓由顚Τ橄笠约肮δ芊纸馑枷氲倪\(yùn)用。
2、加強(qiáng)了java中GUI圖形化開發(fā)中各種組件的運(yùn)用,以及java中多線程編程運(yùn)用。
3、加強(qiáng)鍛煉了網(wǎng)絡(luò)編程基礎(chǔ)技術(shù),加深了對TCP協(xié)議的理解,鍛煉自身的編程能力以及獨(dú)立解決問題的實(shí)踐能力。