最近使用Socket網路通訊端編程中,在同步與非同步通訊中用戶端與伺服器總是無法響應,但在學習Tcp協議編程中完成了通訊聊天功能,下面簡單講講我最近學到的及Tcp聊天的原始碼及詳細注釋。
Tcp協議是一個傳輸層的協議,在Tcp協議編程中它通常使用的是3個類,其命名空間為System.Net.Sockets:
1.TcpListener:基於TCP協議服務端開發,監聽IP地址和連接埠號碼是否串連。
該類常用的方法有Start()開始監聽、AcceptSocket()返回通訊端接受串連請求、AcceptTcpClient()返回客戶對象接受串連請求、Stop()停止監聽
2.TcpClient:基於TCP協議用戶端編程,提供用戶端串連,通過網路連接發送接受資料。
該類常用的方法有Connect()與伺服器主機串連、GetStream()用來獲得答應的資料流、Close()關閉串連
3.NetWorkStream:用於擷取和操作網路流,該程式中還是用寫入流和讀取流對象實現寫入和讀取資料的操作。
該類常用的方法有Read()從網路流中讀取資料、Write()從網路流中寫資料。
下面是這個例子的原始碼:(該代碼是根據自己所學及《C#範例開發大全》中一個例子改變而來通過兩個控制台程式實現通話)
1.服務端代碼(TCPServer)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//添加新的命名空間using System.Net;using System.Net.Sockets; using System.IO; //流StreamReadernamespace TCPServer{ class Program { static void Main(string[] args) { //Parse將字串轉換為IP地址類型 IPAddress myIP = IPAddress.Parse("127.0.0.1"); //構造一個TcpListener(IP地址,連接埠)對象,TCP服務端 TcpListener myServer = new TcpListener(myIP,6688); //開始監聽 myServer.Start(); Console.WriteLine("等候一個串連..."); //構造TCP用戶端:接受串連請求 TcpClient client = myServer.AcceptTcpClient(); Console.WriteLine("用戶端已經串連..."); //構造NetworkStream類,該類用於擷取和操作網路流 NetworkStream stream = client.GetStream(); //讀資料流對象 StreamReader sr = new StreamReader(stream); //寫資料流對象 StreamWriter sw = new StreamWriter(stream); while (true) { Console.WriteLine("用戶端:" + sr.ReadLine()); string msg = Console.ReadLine(); sw.WriteLine(msg); sw.Flush(); //重新整理流 } client.Close(); //關閉用戶端 } }}
2.用戶端代碼(TCPClient)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//添加新的命名空間using System.Net;using System.Net.Sockets;using System.IO; //流StreamReadernamespace TCPClient{ class Program { static void Main(string[] args) { //Parse將字串轉換為IP地址類型 IPAddress myIP = IPAddress.Parse("127.0.0.1"); //構造一個TcpClient類對象,TCP用戶端 TcpClient client = new TcpClient(); //與TCP伺服器串連 client.Connect(myIP, 6688); Console.WriteLine("伺服器已經串連...請輸入對話內容..."); //建立網路流,擷取資料流 NetworkStream stream = client.GetStream(); //讀資料流對象 StreamReader sr = new StreamReader(stream); //寫資料流對象 StreamWriter sw = new StreamWriter(stream); while (true) { string msg = Console.ReadLine(); sw.WriteLine(msg); sw.Flush(); //重新整理流 Console.WriteLine("伺服器:" + sr.ReadLine()); } client.Close(); Console.Read(); } }}
3.程式示範
先運行伺服器(TCPServer)代碼,它會顯示“等候一個串連...”.再運行用戶端(TCPClient)代碼,運行後此時服務端顯示"用戶端已串連...",用戶端顯示"伺服器已串連...請輸入對話內容".然後依次在用戶端和伺服器中個輸入聊天內容,在另一方會顯示相應傳輸過來的內容,實現TCP聊天通話。下面是在用戶端輸入"你好!我是用戶端."的反應。
更多的通話內容如下所示:
總結:這是自己認為寫得比較好的一篇文章,它比較實用,更重要的是我編寫上面的代碼能運行。我們只需要稍微的介面設計就能實現一個有介面的網路聊天室.它涉及到的知識主要是C#網路編程中的TCP編程知識,最近寫Socket通訊端方面的通訊總是失敗,也看了很多部落格下載了很多程式,但都沒一個比較滿意的。希望上面的文章能幫組到大家,有錯誤不足之處見諒!
最後感謝劉麗霞的《C#範例開發大全》和周存傑的《C#網路編程執行個體教程》兩本書,上面的知識點和代碼都是借鑒了他們前人的知識,希望大家也看看這兩本比較好的C#書。
(By:Eastmount 2013-7-20)