根據通訊協議做乙個簡單的聊天對話的個人設計思路

2021-09-02 04:48:48 字數 3549 閱讀 9728

一、通訊中包含的主要內容:

客戶端伺服器

連線伺服器:

socket cilent = new socket(ip位址,伺服器設定的埠號);

監聽伺服器端口:

serversocket ss = new serversocket(設定埠號);

接收客戶端的連線:

socket socket = ss.accept;

inputstream input = cilent.getinputstream;

read()方法讀取伺服器傳送過來的資訊。

outputstream output = socket.getoutoutstream;

write()方法往客戶端傳送資訊。

outputstream output = cilent.getoutoutstream;

write()方法往伺服器傳送資訊。

inputstream input = socket.getinputstream;

read()方法讀取客戶端傳送過來的資訊。

注意:1、伺服器和客戶端要分開設計,最好是各建乙個工程。

2、讀read和寫write都是通過位元組的形式完成的(自己還可重新定義讀和寫的方法)。

3、寫入和讀取的順序不要混淆。

二、主要設計思路:

1、首先是編寫乙個簡單的伺服器。

(1)、先建乙個帶有主函式的類myserver,在這個類中實現乙個myserver方法,該方法中用於建立監

聽埠的套接字serversocket物件,並接受客戶端socket的訪問,例如:

public void setserver(int port) catch (ioexception e) 

}

再主函式中呼叫該方法,然後就可以通過(程式---執行---cmd---telnet  ip位址  埠號)訪問這個簡單

伺服器,此時只可以訪問這個伺服器,還不可以與伺服器進行交流。

(2)、如果要進行交流,就要有輸入輸出流進行讀寫資訊

inputstream input = socket.getinputstream;

outputstream output = socket.getoutputstream;

需注意:讀和寫都是通過位元組的形式完成的。自己定義寫入和讀取的規則

(3)、如果要伺服器接受多個客戶端,就要把接受訪問的socket的物件放到乙個死迴圈中,這樣伺服器

就一直處於等待接受狀態。例如:

while(true)
(4)、然後新增乙個執行緒,把socket物件接收到的連線放到這個執行緒中處理,再新增乙個死迴圈,讓服

務器一直處於傳送和讀取資訊狀態。例如:

public serverthread(socket scoket)

public void run()

} catch (exception e)

}

2、編寫乙個客戶端。

乙個簡單的客戶端只要可以傳送和接受訊息,並在介面上顯示出來就可以了。設定乙個簡單的聊天

介面,介面上有兩個文字區(乙個用於往伺服器傳送訊息,乙個用於顯示從伺服器接收到的訊息)和一

個傳送按鈕,並且給按鈕新增事件***。

介面完成後,首先要把客戶端與伺服器建立連線,這就要建立socket物件,要傳送和接收到訊息

就要建立輸入輸出流物件,例如:

socket cilent = new socket(192.0.0.133(ip位址),8888(這裡要填寫伺服器設定的埠號));

輸入流  inputstream input = cilent.getinputstream;

輸出流   outputstream output = cilent.getoutputstream;     

然後就可以獲取文字區中輸入的內容及按鈕物件,往伺服器傳送訊息(輸出流的write()方法)和接

受訊息(輸入流的read()方法)。例如:

//得到在第二個文字框中輸入的內容

string cmd = jtf1.gettext();

try catch (ioexception e1)

3、新增新的功能,完善伺服器和客戶端。

(1)、給客戶端新增登入介面。

首先設定登入介面,登入介面包含賬號輸入框和密碼輸入框,還有登入和註冊按鈕。客戶端

把socket物件以及輸入輸出流物件設定在登入介面的事件***類裡面,其它地方需要時,可以

通過構造方法或get方法把它們傳過去。在伺服器端把讀取的賬號和密碼驗證是否存在之前,自己

先定義一些賬號和密碼,並進行初始化存到集合框架中(例如:雜湊表),然後驗證,並把驗證

結果返還給客戶端,並作相應的處理。

在伺服器中驗證賬號和密碼:

//判斷賬號和密碼是否正確

if(password.equals(map.get(username))&&equser())else if(password.equals(map.get(username))&&!equser())else

(2)、給客戶端新增註冊功能。

首先設定註冊介面,登入介面包含賬號輸入框、密碼輸入框和密碼重新輸入框,還有確定和

取消按鈕。先通過構造方法把輸入輸出流物件傳過來,先驗證兩次輸入的密碼是否正確,若正

確,把賬號和密碼傳送給伺服器,驗證該賬號是否存在,若不存在,直接把賬號和密碼存到雜湊

表中或存到乙個檔案中,若存在,返還一條資訊給客戶端。

在伺服器中驗證註冊的賬號和密碼:

//讀取註冊的賬號

string suer = readline(input);

//讀取註冊的密碼

string spass = readline(input);

//初始化乙個布林型別的變數,用於標示註冊的使用者是否存在,true表示註冊的使用者不存在,false表示註冊的使用者存在

boolean flag = true;

setset = map.keyset(); //建立set物件,並獲取雜湊表中的使用者名稱集合,set中存的內容是無序的且不可重複的

iteratoriter = set.iterator(); // 建立迭代物件,

while(iter.hasnext())

}

if(flag == true)

(3)、客戶端與客戶端能夠實現群聊。

在伺服器端建立乙個陣列佇列(或其它集合框架),把每個接收到訪問的socket的物件或

socket物件的執行緒存到佇列中,傳送訊息時,遍歷佇列,往每個客戶傳送訊息。

群聊時直接呼叫**的方法:

/**

* 傳送一條訊息

*/public void sendmsg(string msg) catch (ioexception e) }

/*** **訊息

* @param msg

*/public void sendallmsg(string msg)

}

乙個簡單的PCIE驅動到裝置的通訊協議

本文主要介紹乙個簡單的單一裝置pcie驅動程式和裝置的通訊協議,從上到下大致分為三層 應用層 驅動層和裝置層。其中,應用層和驅動層通過系統匯流排 win32 api呼叫 實現通訊,驅動層和裝置層通過pci匯流排 位址空間對映 進行通訊。一 driver和device的資料互動方式 driver和de...

看了這,我也能設計乙個通訊協議

最近給 tkeyboard 增加了不少新功能,其中最有意義的部分是,通過藍芽和 wifi,配合 protobuf,在 mac 和 ios 之間建立了兩條便捷的資料交換通道,算是打好了未來產品開發的地基,網路通道建立好了,後續的想象空間也大。比如,現在可以將 iphone 上 safari 正在瀏覽的...

websocket實現乙個簡單的聊天室對話

npm install socket.io client socket是乙個高效能的伺服器框架,開發者只要實現一兩個介面,便可以開發出自己的網路應用,例如rpc服務 聊天室伺服器 手機遊戲伺服器等。koa 通過 node.js 實現了乙個十分具有表現力的 http 中介軟體框架,力求讓 web 應用...