下面的應用程式中有兩個類,乙個實現socket伺服器端,另乙個實現socket客戶端。
socket伺服器端應用程式
socket伺服器應用程式在socketserver類中實現(檔名為socketserver.cs)。這個類包含乙個主要的socket物件(m_mainsocket)和一組工作socket物件(m_workersocket)。主socket物件負責監聽客戶端。一旦客戶端連線上,主socket便將處理該客戶端事務的工作交給工作socket處理。之後,主socket返回,繼續監聽其他客戶端。
beginaccept()和beginrecieve()是在socket伺服器應用程式的socket類中的兩個重要方法。
beginaccept()方法如下:
public
iasyncresult beginaccept(
asynccallback callback;
//(1)客戶端連線上時呼叫的函式
object
state
//(2)儲存socket資訊的狀態物件
); 當呼叫主socket物件中的listen()方法後,便呼叫這個非同步通訊方法並指定乙個**函式(1),該函式可用來進一步處理客戶端連線的操作。狀態物件(2)在這個例項中可以為空。
由於這是乙個非同步通訊方法,因此它會立即返回,保證伺服器的主線程能夠自由處理其他事件。在這之後,會啟動乙個單獨的執行緒來監聽指定的socket的客戶端連線。當乙個客戶端發出連線請求時,自定義的**(callback)函式會觸發。
在**函式中(示例中的函式名為「onclientconnect()」),使用者可以進一步處理客戶端連線的操作。
public
void
onclientconnect(iasyncresult asyn)
... connected
", m_clientcount);
textboxmsg.text
=str;
//當主socket空閒,則可以返回,並等待其他客戶端的連線
m_mainsocket.beginaccept(
newasynccallback ( onclientconnect ),
null
);catch
(objectdisposedexception)
catch
(socketexception se)
} 在「onclientconnect()」函式中做的第一件事,便是在m_mainsocket的成員物件中呼叫「endaccept()」方法,返回乙個有關的新的socket物件。然後,將這個物件與m_mainsocket中的一組socket中的某個socket物件相關聯,並且增加客戶端的計數。此時,由於這個新的socket已經關聯到連線上的客戶端,便可以進行一系列的操作,因此,主socket(m_mainsocket)空閒。這時,再次呼叫beginaccept()方法來等待其他客戶端發出的連線請求。
在工作socket中,使用簡單的策略來接收客戶端的資料。在這裡,呼叫beginreceive()和endreceive()方法來代替beginaccept()和endaccept()方法。這便是socket伺服器的簡單應用。當需要向客戶端傳送資料時,伺服器使用特定的工作socket物件來給每個客戶端傳送。
Socket非同步程式設計
以 socket 通訊中的非同步方法為例 public static manualresetevent connectdone new manualresetevent false public static void connectcallback iasyncresult ar sclient....
非同步Socket程式設計I
下面,用乙個例子來解釋同步通訊和非同步通訊的根本區別。假定乙個伺服器應用程式在指定埠監聽客戶端傳送來的資料。在同步通訊接收中,當伺服器等待從客戶端接收資料時,如果流沒有資料,那麼,主線程會阻塞,直到資料請求得到。因此,在這段時間,伺服器端不能進行任何工作,直到接收到該客戶端的資料。如果此時,另乙個客...
2 1 4非同步Socket程式設計例項
首先我們了解下關於非同步程式設計的一些知識可以參考我在網上收集的一些資料 c 非同步socket程式設計 我實現了基於非同步通訊的socket伺服器和客戶端程式 下面是我的 第一步 首先新建乙個服務端專案ybserverwindowsforms 然後在專案裡新增乙個自定義的類名為stateobjec...