1. 程式人生 > >java聊天室設計及實現

java聊天室設計及實現

這是大二剛學java時做的東西,執行伺服器,註冊兩個客戶端,登入後客戶端之間可以進行文字聊天,有群發功能。

如何實現:

呼叫ServerSocket來建立繫結在指定埠上的伺服器,然後呼叫accept方法阻塞,等待客戶端的連線,連上後返回socket連線物件。

然後將這個連線物件作為引數傳入,並例項化一個處理客戶端的執行緒物件,將一個客戶對應的處理執行緒物件加到佇列中。啟動這個執行緒物件。通過這個物件獲取輸入輸出流,然後進行訊息的讀取和傳送。

因為訊息有不同的型別,所以需要定義協議,這個地方採用的是第一個字元作為訊息的型別,判斷是註冊登入還是聊天,使用者名稱和密碼用#分割。

處理客戶機執行緒物件的類有將客戶及移除,可以呼叫執行緒物件某一使用者傳送訊息,及群發訊息的方法。

客戶端方面:首先執行頁面上有登入註冊的功能。都是通過一個連線物件向伺服器傳送訊息。例項化socket來建立連線物件,並獲取連線物件的io流。登入成功後顯示聊天介面,監聽類負責傳送訊息。

接下來說類與類之間的關係,首先看伺服器:

1.ServerUI類,是伺服器的入口,main方法中例項化ServerUI並呼叫初始化init方法。啟動按鈕上新增監聽器:例項化myServer類,傳入埠號和訊息框,並呼叫start方法。

2.myServer類中:

ServerSocket server = new ServerSocket(port);

client = server.accept();// 阻塞,等待客戶機連線,連上後返回Socket物件

SerThread st = new SerThread(client, textShow);
ChatTools.addclient(st);//將物件加入客戶機佇列
st.start();

3.SerThread類中:

獲取連線物件和訊息顯示框。從socket獲取輸入輸出流, 

public void run() {
ChatProcess();
}

ChatProcess()讀取資料,根據第一個字元判斷訊息型別,用#分割使用者名稱密碼。建立使用者物件,並存在靜態塊的雜湊表中。其中呼叫chattool中傳送資訊的方法。

4.chattool中將一個客戶對應的處理執行緒物件加到佇列中,並有給某一使用者傳送訊息,移除物件,給所有使用者傳送訊息等功能。

List<SerThread> stList = new ArrayList();

管理多個SerThread物件。

客戶端:

1.ClientUI:

public static void main(String[] args) {
ClientUI cu = new ClientUI();
cu.showUI();
}

註冊登入按鈕加監聽LoginRegListener:


2.LoginRegListener:

private void reg() {
RegisterUI rui = new RegisterUI();
rui.initUI();
}

login():

// 建立連線物件
nc = new Neclient("localhost", 1111); nc.isconnect();

ChatUI cui = new ChatUI(nc);//顯示聊天介面,傳入連線物件
cui.showChatUI();

3.Neclient

public boolean isconnect() :
client = new Socket(this.serverIP, this.port);// 建立伺服器連線物件
InputStream ins = client.getInputStream(); // 得到輸入輸出流物件
ous = client.getOutputStream();
brd = new BufferedReader(new InputStreamReader(ins)); // 可以讀取一行字串

// 執行緒中讀取伺服器發來的訊息
public void run() {
while (true) {
readFromServer();
}
}

該類中還包括讀取傳送訊息的方法。

4.ChatUI類:傳送群發按鈕,並加監聽

ReadMsg rm = new ReadMsg(client, jt_show);// 使讀寫訊息分離,能隨時讀取訊息
rm.start();

5.SendLister:

取得輸入文字框內的內容,傳送伺服器 String msg = jt_input.getText();

/** 傳送訊息到伺服器 */  

os.write(msg.getBytes()); //為什麼使用客戶端的輸出流能向伺服器寫訊息
this.os.flush();

6.ReadMsg

 ReadMsg(Socket client, JTextArea jt_show)// 建構函式,傳入客戶端連結物件,和文字區域顯示物件

is=client.getInputStream();
brd=new BufferedReader(new InputStreamReader(is));

input=brd.readLine();

jt_show.append(input + "\n"); // 將伺服器傳送到輸入流的內容追加到自己的文字顯示區

專案中遇到的難點:

1.一開始沒設計好,導致後面增加介面和功能有問題。所以重構了一遍,從介面寫起。

2.中文字元,使用stringbuffer

3.資訊協議

技術點:

socket,類之間的關係,協議,執行緒,tcp/ip,jvm。

2017.2.19

長沙

相關推薦

java聊天設計實現

這是大二剛學java時做的東西,執行伺服器,註冊兩個客戶端,登入後客戶端之間可以進行文字聊天,有群發功能。 如何實現: 呼叫ServerSocket來建立繫結在指定埠上的伺服器,然後呼叫accept方法阻塞,等待客戶端的連線,連上後返回socket連線物件。 然後將

基於linux的TCP網路聊天設計實現

利用Linux實現基於TCP模式的網路聊天程式 主要完成的兩大組成部分為:伺服器和客戶端。 伺服器程式主要負責監聽客戶端發來的訊息。 客戶端需要登入到伺服器端才可以實現正常的聊天功能。該程式是利用程序以及共享記憶體來實現群傳送訊息的。 以下簡單分析一下

Java Web許可權管理設計實現

最近在做一個許可權相關的功能,在專案原有許可權管理上面進行擴充套件,一方面支援介面上控制到按鈕級別,後端介面沒有許可權不能進行訪問;另一個方面,對專案中應用管理模組的應用管理員授權,使其具有對其名下的

java 聊天之 傳送圖片文字等功能的實現

  前幾日寫的一篇簡陋之極的java聊天室被各位前輩說是,一塌糊塗,烏煙瘴氣,只是簡單的實現了需要的功能,並未做到人性化。在下痛定思痛,心想還是先學會顯示功能再做美化介面,美化程式碼的打算!      在奮鬥了一天之後終於完成了集圖片,文字,直線等功能為一體的群聊天室。先分析

重構 JAVA 聊天 —— CS 模式的簡單架構實現

前言 自從開始弄起資料探勘之後,已經很久沒寫過技術類的部落格了,最近學校 JAVA 課設要求實現一個聊天室,想想去年自己已經寫了一個了,但是有些要求到的功能我也沒實現,但看著原有的程式碼想了想加功能好像有那麼點點難,於是就想著重構,也正好之前有看到別人寫的CS架構的程式碼,感覺擴充套件性還不錯,就試著寫了寫

實現自定義查詢的數據庫設計實現(一)

bre 名稱 審批流程 work 數據庫名 需要 自定義查詢 perm 枚舉 需求 先說一下需求:實現用戶自定義的查詢,用戶可以自定義要查詢的列、自定義條件條件、自定義排序。除了查詢使用外,還可以使用於各個需要根據條件進行約束的業務,如權限; 本設計和實現,很大部分是通過數

實現自定義查詢的數據庫設計實現(二)

表名 table abr bigint sts 處理 update 關聯表 creat 上部分大概講了一下表設計,這部分講一下處理。 處理的結構 處理結構的內容比較多,分為幾個部分分別講解一下。首先講解一下尋找關系表。 尋找關系表 尋找關系表根據“表間關系登記表”進行處

Java LinkedList工作原理實現

++ 部分 更多 size mov info 容量限制 element git 1. 概述 以雙向鏈表實現。鏈表無容量限制,但雙向鏈表本身使用了更多空間,也需要額外的鏈表指針操作。 按下標訪問元素—get(i)/set(i,e) 要悲劇的遍歷鏈表將指針移動到位(如果i&g

基於redis的訊息佇列的設計實現

訊息佇列 所謂訊息佇列,就是一個以佇列資料結構為基礎的一個真實存在的實體,如陣列,redis中的佇列集合等等,都可以。 為什麼要使用佇列 主要原因是由於在高併發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MySQL,直接導致無

文獻筆記03-基於異構資料來源的網路等級考試報名管理系統設計實現

一、基本資訊 標題:基於異構資料來源的網路等級考試報名管理系統設計及實現 時間:2008. 出版源:中國知網 領域分類:計算機應用及軟體 二、研究背景 隨著我國高校擴大招生工作的進行,高校對學生的等級考試管理工作也面臨著新的要求。全國大學英語四、六級考試,專業外語四、八級考試,計算機等級考試,普通

JAVA聊天-極簡版

實現客戶端和服務端的連線並且可以群聊*##“` 客戶端 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStrea

文獻綜述六:基於JS 技術的電子商品管理系統設計實現

一、基本資訊   標題:基於JS 技術的電子商品管理系統設計及實現   時間:2017   出版源:無線互聯科技   檔案分類:js技術的研究 二、研究背景   主要對Js下電商管理系統的設計及實現進行了探討,利用軟體工程的設計方法和先進的軟體開發框架來實現電子商務管理。 三、具體內容   開頭提到了什麼是j

《高校校園超市管理系統的設計實現》論文筆記(八)

一、基本資訊 標題:高校校園超市管理系統的設計及實現 時間:2016 來源:湖南大學 關鍵詞:校園超市; 管理資訊系統; 管理模組; 二、研究內容 1.管理系統:         該篇論文很清晰的解釋了一個概念,管理系統。概念的創始人G

秒殺系統的架構設計實現

秒殺場景在電商平臺是十分常見的,這種營銷活動往往具有時間短,併發量大的特點。 關於資料庫效能 TPS:資料庫每秒執行的事務數。 QPS:資料庫每秒執行的SQL數。 對於msql資料庫,8核CPU16G記憶體通常TPS:1000 QPS:20000 系統邏輯梳理 使用者介面點選

#java 聊天(二)—— 給聊天增加選單和私聊功能

#java    聊天室(二)——  給聊天室增加選單和私聊功能 在上一篇部落格裡,我們實現了用java寫了一個telnet聊天伺服器,實現了群聊功能。今天我們就來給這個聊天室新增選單,並且實現私聊功能。  1.實現目標   在使用者登入後顯示選單: 當用

Pika的設計實現

pika是360奇虎公司開源的一款類redis儲存系統,主要解決的是使用者使用 Redis 的記憶體大小超過 50G、80G 等等這樣的情況,會遇到啟動恢復時間長,一主多從代價大,硬體成本貴,緩衝區容易寫滿等問題。 Pika 就是針對這些場景的一個解決方案: Pika

Java動態代理原理實現

     最近專案和看技術文章的時候接觸了點Java動態代理和cglib、asm等知識,發現對於動態代理整套機制理解不夠,總以為是採取切片等方式,執行時利用反射,通過標記等在需代理方法或者介面等上下文中執行某種增強方法,未想到會有中間位元組碼的動態生成,看到博主的這篇文章,

Java聊天

1.首先是伺服器的介面實現,如下:       2.如何實現呢?主要使用swing和awt,首先整個是一個Frame容器,然後設定它的佈局為BoderLayout,最上邊的是一個Panel,設定它的佈局為GridLayout,中間使用了JSplit

Go websocket 聊天的詳細實現和詳細分析

websocket 聊天室資料結構分析 首先要做一個聊天室我們需要把所有的連線資訊都儲存下來 所以就需要有一個客戶端 client 的 manager ,manager 裡應該儲存所有的client 資訊 所以在我們的程式裡定義了 ClientManager 這個

透明加密系統設計實現-緒論

隨著資訊時代的到來,計算機成為了人們日常生活的必備之物。大量的桌面計算機和移動終端裝置給人們帶來了極大的方便,但是也增加的個人的機密資訊洩密的可能性。特別是對於機密部門的機密資料和企業公司的核心技術等更容易通過資訊科技的通道洩密,資訊科技安全面臨著前所未有的挑戰。通常的網路隔離及網路防火牆很難再滿足