通過以上方法得到NetworkStream網絡流之後,你就可以使用標准流讀寫方法Write和Read來發送和接受數據了。
以上是.Net下使用TcpClIEnt類實現客戶端編程的技術資料,為了向客戶端提供這些服務,我們還需要編制相應的服務端程序,前一篇《Visual C#.Net網絡程序開發-Socket篇》上曾經提到, Socket作為其他網絡協議的基礎,既可以面向客戶端開發,也可以面向服務端開發,在傳輸層面上使用較多,而在應用協議層面上,客戶端我們采用構建於Socket類之上的TcpClIEnt取代Socket;相應地,構建於Socket之上的TcpListener提供了更高理念級別的 TCP 服務,使得我們能更方便地編寫服務端應用程序。正是因為這樣的原因,像FTP 和 HTTP 這樣的應用層協議都是在 TcpListener 類的基礎上建立的。
.Net中的TCPListener 用於監視TCP 端口上的傳入請求,通過綁定本機IP地址和相應端口(這兩者應與客戶端的請求一致)創建TcpListener對象實例,並由Start方法啟動偵聽;當TcpListener偵聽到用戶端的連接後,視客戶端的不同請求方式,通過AcceptTcpClient 方法接受傳入的連接請求並創建 TcpClient 以處理請求,或者通過AcceptSocket 方法接受傳入的連接請求並創建 Socket 以處理請求。最後,你需要使用 Stop 關閉用於偵聽傳入連接的 Socket,你必須也關閉從 AcceptSocket 或 AcceptTcpClIEnt 返回的任何實例。這個過程詳細解說如下:
首先,創建TcpListener對象實例,這通過TcpListener類的構造方法來實現:
public TcpListener(port);//指定本機端口
public TcpListener(IPEndPoint)//指定本機終結點
public TcpListener(IPAddress,port)//指定本機IP地址及端口
以上方法中的參數在前面多次提到,這裡不再細述,唯一需要提醒的是,這些參數均針對服務端主機。下面的示例演示創建 TcpListener 類的實例:
IPHostEntry ipInfo=Dns.Resolve("127.0.0.1");//主機信息
IPAddressList[] ipList=ipInfo.IPAddressList;//IP數組
IPAddress ip=ipList[0];//IP
try{
TcpListener tcpListener = new TcpListener(ipAddress, 4088);//創建TcpListener對象實例以偵聽用戶端連接
}
catch ( Exception e){
MessageBox.Show("TcpListener錯誤:"+e.Message);
}
隨後,你需要調用Start方法啟動偵聽:
public void Start();
其次,當偵聽到有用戶端連接時,需要接受掛起的連接請求,這通過調用以下兩方法之一來完成連接:
public Socket AcceptSocket();
public TcpClient AcceptTcpClIEnt();
前一個方法返回代表客戶端的Socket對象,隨後可以通過Socket 類的 Send 和 Receive 方法與遠程計算機通訊;後一個方法返回代表客戶端的TcpClient對象,隨後使用上面介紹的 TcpClient.GetStream 方法獲取 TcpClIEnt 的基礎網絡流 NetworkStream,並使用流讀寫Read/Write方法與遠程計算機通訊。
最後,請記住關閉偵聽器:public void Stop();
同時關閉其他連接實例:public void Close();
下面的示例完整體現了上面的過程:
bool done = false;
TcpListener listener = new TcpListener(13);// 創建TcpListener對象實例(13號端口提供時間服務)
listener.Start();//啟動偵聽
while (!done) {//進入無限循環以偵聽用戶連接
TcpClient client = listener.AcceptTcpClient();//偵聽到連接後創建客戶端連接TcpClIEnt
NetworkStream ns = clIEnt.GetStream();//得到網絡傳輸流
byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());//預發送的內容(此為服務端時間)轉換為字節數組以便寫入流
try {
ns.Write(byteTime, 0, byteTime.Length);//寫入流
ns.Close();//關閉流
clIEnt.Close();//關閉客戶端連接
}
catch (Exception e) {
MessageBox.Show("流錯誤:"+e.Message)
}