12篇學通C#網路編程——第四篇 TCP應用編程

來源:互聯網
上載者:User

    年底了,人浮躁多了,沉不下去心研究技術了,不過昨天終於搶到了回家的票,很開心。

    言歸正卷,在WCF出來之後,可能我們玩這些原始的TCP越來越少了,我們知道WCF對TCP進行了再一次的封裝,第一反應給我們的或許是

同構系統用TCP,異構系統用HTTP,那麼問題來了,異構系統到底可不可以用TCP呢?至少WCF是玩不了的,因為其他語言沒有針對.net的“服務

引用”,也沒有什麼ChannelFactory給你去玩,如果你是一定要追求效能的話,原始的TCP會助你一臂之力的。

   我們知道最最原始的是玩Socket,由於Socket比較複雜,但是最靈活,C#裡面提供了兩個簡化的封裝類:TcpListener和TcpClient。

一:TcpListener

   這個是作為伺服器端程式而存在的,我們來看看如何使用這服務端。

1: 開啟監聽地址

1 TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);2 3 listener.Start();

 

2:好了,已經開啟了,服務端程式開始監聽該連接埠的用戶端請求了,那麼如何擷取該請求呢?簡單,listener的AcceptTcpClient屬性搞定。

1 var myclient = listener.AcceptTcpClient();

 3:我們知道TCP傳的是位元組流,通過myclient.GetStream()就可以擷取一個NetworkStream,利用這個Stream就可以進行收發資訊了。

 <1> 收操作:

1 BinaryReader sr = new BinaryReader(client.GetStream());2 3  //用戶端資料4  var data = sr.ReadString();

<2>發操作:也就是所謂的傳回值

1 //處理完了之後要返回資料給用戶端2 BinaryWriter sw = new BinaryWriter(client.GetStream());3 4 sw.Write(string.Format("目前時間:{0},服務端已經處理完畢!", DateTime.Now));

 

  這裡要注意的地方就是AcceptTcpClient是阻塞線程的,直到收到用戶端請求才算建立了一個TCP串連,在服務端處理的過程中,後續的用戶端的請求將

會處理等待直到前一個請求處理完,說了這麼多,就是每一個請求我們都建議開一個線程專門為其服務,類似這樣。

 1 //接受用戶端的串連請求 2 var myclient = listener.AcceptTcpClient(); 3  4 //用背景工作執行緒執行使用者的請求 5 Task.Factory.StartNew((obj) => 6 { 7     var client = obj as TcpClient; 8  9     client.Close();10 11 }, myclient);

好了,伺服器端大概就是這個樣子,再有的就是一些相關屬性配置了,像wcf那樣什麼opentime,sendtime啥的。

 

二:TcpClient

     用戶端也很簡單,只要我們Connect一下連接埠,然後通過NetworkStream再Send一些資料就OK了。

1 TcpClient client = new TcpClient();2 3 client.Connect(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);4 5 BinaryWriter bw = new BinaryWriter(client.GetStream());6 7 bw.Write(string.Format("你好,我來請求你! {0},當前線程:{1}", j, Thread.CurrentThread.ManagedThreadId));

三:類比

     最後我們類比下,用戶端開啟100個線程,每個線程請求100次,伺服器端對每個線程都用背景工作執行緒去處理,是不是找到了netTcpBinding的

感覺,最後一個大家都懂的道理就是線程多了不是好事情。

服務端:

View Code

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net.Sockets; 6 using System.IO; 7 using System.Threading.Tasks; 8 using System.Threading; 9 using System.Net;10 11 namespace ConsoleApplication112 {13     class Program14     {15         static void Main(string[] args)16         {17             TcpListener listener = new TcpListener(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);18 19             listener.Start();20 21             //用專門的線程來接受請求22             Task.Factory.StartNew(() =>23             {24                 //不間斷的接受用戶端請求25                 while (true)26                 {27                     //接受用戶端的串連請求28                     var myclient = listener.AcceptTcpClient();29 30                     //用背景工作執行緒執行使用者的請求31                     Task.Factory.StartNew((obj) =>32                     {33                         var client = obj as TcpClient;34 35                         BinaryReader sr = new BinaryReader(client.GetStream());36 37                         //用戶端資料38                         var data = sr.ReadString();39 40                         //用戶端ip41                         var ip = (IPEndPoint)client.Client.RemoteEndPoint;42 43                         Console.WriteLine("目前時間:{0},接受到了來自IP:{1}:{2},的請求,發來的資料為:{3}", DateTime.Now,44                                                                                                 ip.Address, ip.Port, data);45 46                         Thread.Sleep(1000 * 5);47 48                         //處理完了之後要返回資料給用戶端49                         BinaryWriter sw = new BinaryWriter(client.GetStream());50 51                         sw.Write(string.Format("目前時間:{0},服務端已經處理完畢!", DateTime.Now));52 53                         client.Close();54 55                     }, myclient);56                 }57             });58 59             Console.WriteLine("服務端已經啟動...");60 61             Console.Read();62         }63     }64 }

用戶端:

View Code

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net.Sockets; 6 using System.IO; 7 using System.Threading; 8 using System.Threading.Tasks; 9 10 namespace ConsoleApplication211 {12     class Program13     {14         static void Main(string[] args)15         {16             for (int i = 0; i < 100; i++)17             {18                 Task.Factory.StartNew(() =>19                 {20                     for (int j = 0; j < 100; j++)21                     {22                         TcpClient client = new TcpClient();23 24                         client.Connect(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), 2222);25 26                         BinaryWriter bw = new BinaryWriter(client.GetStream());27 28                         bw.Write(string.Format("你好,我來請求你! {0},當前線程:{1}", j, Thread.CurrentThread.ManagedThreadId));29 30                         BinaryReader sr = new BinaryReader(client.GetStream());31 32                         var s = sr.ReadString();33 34                         Console.WriteLine("接受到資料:{0}", s);35                     }36                 });37             }38 39             Console.Read();40         }41     }42 }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.