C 基於Socket的CS模式的完整例子

2022-02-12 00:53:47 字數 3852 閱讀 1671

基於socket伺服器端實現本例主要是建立多客戶端與伺服器之間的資料傳輸,首先設計伺服器。開啟vs2008,在d:\c#\ch17目錄下建立名為socketserver的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17-6所示。

表17-6  新增控制項列表

控    件

name

text

listbox

lbinfo

label

label

button

button1

啟動伺服器

設計好的介面如圖17-2所示。

接下來開始運用前面的知識設計伺服器,主要分為以下步驟。

(1)首先是對一些命名空間的包含,包括system.net、system.net.sockets、system.io和system.threading。然後定義一系列的全域性變數,如下所示。

private socket s;                                    //

定義socket物件

private thread th; //

客戶端連線伺服器的執行緒

public socket csocket; //

單個客戶端連線的socket物件

public networkstream ns; //

網路流public streamreader sr; //

流讀取public streamwriter sw; //

流寫入private

delegate

void settextcallback(); //

用於操作主線程式控制件

(2)接下來是設計客戶端連線的管理,主要包括伺服器與客戶端之間的連線和收發資料問題,把它們放在乙個函式communication裡,如下所示。

public

void communication()

else

}catch (socketexception ex)

catch (exception es)}}

//以下**的用法在第16章有關執行緒的用法時曾提到過,主要用於從當前執行緒操作主線程中的控制項,這裡就不在贅//述

public

void send()

public

void test()

(3)定義好與客戶端的連線後,接下來需要利用執行緒來啟動,雙擊「啟動伺服器」按鈕,新增如下**。

button1.enabled = false;

s = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);//

建立socket物件

ipaddress serverip = ipaddress.parse("

222.18.142.171

");ipendpoint server = new ipendpoint(serverip,13); //

例項化伺服器的ip和埠

s.bind(server);

s.listen(10);

trycatch(exception ex)

(4)最後在關閉伺服器視窗的時候,還應該關閉執行緒和當前socket連線,**如下所示。

protected

override

void dispose(bool disposing)

base.dispose(disposing);

}catch}//

接著為當前窗體的formclosed事件新增如下**。

this.close();

至此,伺服器就設計完了,下面接著看客戶端。

基於socket客戶端實現開啟vs2008,在d:\c#\ch17目錄下建立名為socketclient的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17-7所示。

表17-7  新增控制項列表

控 件 名

name

text

groupbox

groupbox1

向伺服器傳送訊息

label

label1

傳送訊息:

textbox

textbox1

button

button2

傳送listbox

lbinfo

groupbox

groupbox1

伺服器回饋資訊

客戶端的設計主要分為以下步驟。

(1)首先要做的工作還是要引用一些命名空間,如下所示。

using system.io; 

using system.net.sockets;

using system.net;

然後定義一系列的全域性變數,如下所示。  

private socket s;                                         //

定義socket物件

public networkstream ns; //

網路流public streamreader sr; //

流讀取

public streamwriter sw; //

流寫入

(2)雙擊「傳送」按鈕,新增如下**。

s = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);

serverip = ipaddress.parse("

222.18.142.171

"); //

伺服器ip

trycatch (exception ex)

trycatch (exception ex)

(3)最後,關閉socket連線,釋放資源,可以直接在窗體的formclosed事件中進行,如下所示。

s.shutdown(socketshutdown.both);

s.close();

至此,伺服器和客戶端已經全部設計完畢,下面看執行效果。

基於socket的c/s例項的執行首先,啟動伺服器程式,單擊「啟動伺服器」按鈕,如圖17-4所示。接著再啟動客戶端,並在textbox1輸入資料(中英文皆可),多次單擊「傳送」按鈕,如圖17-5所示。

此時,伺服器的狀態如圖17-6所示。

收到客戶端傳送的資料

從圖17-6中可以看出,此時伺服器已經收到來自客戶端的資料,而圖17-5中顯示客戶端也收到了來自伺服器的回饋訊息。此外,本例還能實現多個客戶端向乙個伺服器同時收發資料,並已經在三颱計算機(乙個伺服器和兩個客戶端)上測試通過。本例只是實現了伺服器與客戶端最簡單的資料傳輸,讀者如果有興趣可以在此基礎上再新增其他功能,比如可以利用前面講的資料庫知識,在伺服器端寫個使用者登入驗證,讓客戶端通過驗證後才能收發資料等。

在網路中,收發資料會經常使用socket。本節中主要運用了幾節中介紹的socket基礎知識完成了乙個簡單的基於流的c/s模式例子。在下一節中,將介紹另一種傳輸方式——基於資料報(udp)。

C 基於Socket的CS模式的完整例子

基於socket伺服器端實現本例主要是建立多客戶端與伺服器之間的資料傳輸,首先設計伺服器。開啟vs2008,在d c ch17目錄下建立名為socketserver的windows應用程式。開啟工程,往當前窗體中新增控制項,如表17 6所示。表17 6 新增控制項列表 控 件 name text l...

C 利用Socket實現C S模式通訊

首先我們要了解一下幾點內容 簡單來說 tcp控制傳輸資料,負責發現傳輸的問題,一旦有問題就發出訊號,要求重新傳輸,直到所有資料安全正確地傳輸到目的地,而ip是負責給網際網路中的每一台電腦定義乙個位址,以便傳輸。從協議分層模型方面來講 tcp ip由 網路介面層 鏈路層 網路層 傳輸層 應用層。它和o...

基於TCP的 C S模式 網路應用程式

伺服器端程式實現步驟 1。建立套接字 socket 2。將套接字繫結到乙個本地位址和埠上 bind 3。將套接字設為監聽模式,準本接受客戶請求 listen 4。等待客戶請求到來 當請求到來後,接受連線請求,返回乙個新的對應於此次連線的套接字 accept 5。用返回的套接字和客戶端進行通訊 sen...