客戶端和伺服器之間通訊講解

2021-08-07 19:10:52 字數 2356 閱讀 2576

原文**:

客戶端:

能向伺服器傳送資訊,提出請求。

伺服器:

能接收客戶端發來的請求,並能傳送資料給客戶端以做出回應。

從這裡可以看出,我們的電腦可以充當雙重角色。

1、當我們用瀏覽器瀏覽網頁,要檢視某個檔案時,我們的電腦會發出請求給檔案伺服器,檔案伺服器收到請求並同意後,將檔案資料傳送到我們的電腦。此時,電腦充當客戶端的角色。

2、當電腦和印表機通訊後,印表機傳送列印請求,此時我們可以令電腦發出列印資訊(列印內容,單/雙頁列印等等)給印表機,印表機就可以開始列印了。此時電腦充當伺服器的角色。

二、疑問及其理解

客戶端與伺服器是怎樣進行通訊的?

以上面的電腦例子來說的話。

1、通訊首先需要進行通訊的實體

電腦&&檔案伺服器(可能是臺功能強大的電腦),電腦&&印表機。

2、然後是通訊的媒介

如上面例子中用到的電纜或光纜,當然也可能是介於某一頻譜範圍內的看不見的無線電波。

3、最關鍵的是通訊協議

電腦要和印表機交流,必須要規定通訊的規矩,即協議(電腦傳送一段資料過去,也許就是乙個符號'y',但印表機需要明白這是要列印的意思,所以他們事先要規定好什麼是什麼的意思,才不會出現對牛彈琴的現象)。當然,協議可多了,遠不止於這一點。資訊從電腦發出到檔案伺服器,就進過了許多的協議。本來是一段文字,經過某種協議被轉化成能在媒介中傳遞的電訊號或電磁波等訊號,這些訊號要達到檔案伺服器那一端,中途可能會碰到一系列的節點(能接受資訊並做出處理的系統,如路由器),節點會按照某種協議告訴這些訊號該怎樣走才能到達檔案伺服器,然後訊號開始沿著該節點告訴他的方向繼續傳遞(要知道網際網路的線路可是比蜘蛛網複雜的多,沒有中間一系列節點的幫助,要達到目的地可不容易啊!)。最好要到達目的地時,要按照協議將電訊號或電磁波訊號轉換為檔案伺服器能識別的資訊。意思大概就是這樣,如果想知道具體什麼協議的話,就需要檢視相關文獻了,重中之重莫過於tcp/ip協議了。

三、用socket套接字實現應用程式間的通訊

1、應用程式作為伺服器時,可以用以下**實現:

serversocket server=new serversocket(int port);

//server是建立的伺服器物件,port為該伺服器占用的埠號,只有當伺服器和客戶端的埠號相同時才能連線成功。

在伺服器端進行等待:

socket socket2=server.accept();//伺服器等待客戶機的訪問,程式執行到此處將被堵塞,即不向下繼續執行,直到有客戶機訪問該伺服器

2、應用程式作為客戶端時,可以用如下**來建立將與埠號一致的伺服器相連的客戶端:

socket client=new socket(string ip,int port);

//client是建立的客戶端物件,ip、port分別是該客戶端占用的ip號、埠號,此時伺服器的socket2被宣告成功,堵塞狀態不復存在,程式繼續向下執行

3、客戶端和伺服器連上後,需要進行他們之間的通訊,怎麼辦呢?可以分別獲取兩個物件的輸入、輸出流物件,以進行讀寫操作。

獲取客戶端的輸入、輸出流物件:

inputstream is_client=socket.getinputstream();

//is_client是客戶端socket的輸入流物件

outputstream os_client=socket.getoutputstream();

//os_client是客戶端socket的輸入流物件

同樣的,可以獲取伺服器端的輸入、輸出流物件:

inputstream is_server=socket2.getinputstream();

//is_server是客戶端socket的輸入流物件

outputstream os_server=socket2.getoutputstream();

//os_server是客戶端socket的輸入流物件

4、有了輸入、輸出流物件後,可以用讀寫操作進行伺服器和客戶端之間的通訊了。

a、客戶端寫入資訊,伺服器獲取資訊:

is_client.write("hello#".getbytes());//客戶端寫入"hello」,'#'是資訊結束的協議

stringbuffer sb=new stringbuffer();//sb是長度可動態變化的字串物件,便於新增字元和字串,用來儲存下面伺服器讀到的資訊

char c;//用於儲存讀到的單個位元組

c=os_server.read();//將讀到的乙個位元組儲存到變數c中

while(c!='#')

接下來,伺服器就可以對儲存在sb中的資訊進行相應的處理

b、同理,伺服器回應客戶端的過程,也就是伺服器寫入資訊(os_server.write()),客戶端讀取資訊(is_client.read())的,只是將上面的輸入、輸出流物件變換一下

C Socket多客戶端和伺服器通訊

1 總述 關於socket通訊主要採用了c 程式設計,實現多執行緒通訊,多個客戶端同時和伺服器通訊,並支援伺服器以廣播的形式向所有客戶端傳送訊息,該歷程未加介面。具體的細節和原始碼見下分析 2 執行流程 伺服器端 執行程式後,輸入 s 啟動伺服器,並提示下一步該怎樣操作。此時可以連線客服端,當有客戶...

Redis客戶端和伺服器

一 redis客戶端 redisserver結構中儲存了所有客戶端的狀態資訊。struct redisserver 命令client list可以列出目前所有連線到伺服器的客戶端。命令client setname name 可以給客戶端設定乙個名字。偽客戶端 由於伺服器必須接收來自客戶端的命令以執行...

Redis 客戶端和伺服器

客戶端的資料結構 typedef struct redisclient redisclient 名字 name 標誌值 flags 指向客戶端正在使用的資料庫的指標,以及該資料庫的號碼 當前要執行的命令 命令的引數 命令的個數,以及指向命令實現函式的指標 輸入緩衝區 querybuf 輸出緩衝區 複...