日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#服務端程序實現(xiàn)同步傳輸字符串淺析

C#服務端程序實現(xiàn)同步傳輸字符串問題的由來:我們可以在TcpClient上調用GetStream()方法來獲得連接到遠程計算機的流。注意這里我用了遠程這個詞,當在客戶端調用時,它得到連接服務端的流;當在服務端調用時,它獲得連接客戶端的流。接下來我們來看一下代碼,我們先看服務端(注意這里沒有使用do/while循環(huán)):

成都創(chuàng)新互聯(lián)專注于梅縣企業(yè)網(wǎng)站建設,響應式網(wǎng)站開發(fā),商城網(wǎng)站定制開發(fā)。梅縣網(wǎng)站建設公司,為梅縣等地區(qū)提供建站服務。全流程定制網(wǎng)站開發(fā),專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

C#服務端程序實例:

 
 
 
  1. //C#服務端程序  
  2. class Server {  
  3. static void Main(string[] args) {  
  4. const int BufferSize = 8192;// 緩存大小,8192字節(jié)  
  5.  
  6. Console.WriteLine("Server is running ... ");  
  7. IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });  
  8. TcpListener listener = new TcpListener(ip, 8500);  
  9.  
  10. listener.Start();   // 開始偵聽  
  11. Console.WriteLine("Start Listening ...");  
  12. //C#服務端程序  
  13. // 獲取一個連接,中斷方法  
  14. TcpClient remoteClient = listener.AcceptTcpClient();  
  15. // 打印連接到的客戶端信息  
  16. Console.WriteLine("Client Connected!{0} <-- {1}",  
  17. remoteClient.Client.LocalEndPoint,  
  18.  remoteClient.Client.RemoteEndPoint);  
  19.  
  20. // 獲得流,并寫入buffer中  
  21. NetworkStream streamToClient = remoteClient.GetStream();  
  22. byte[] buffer = new byte[BufferSize];  
  23. int bytesRead = streamToClient.Read(buffer, 0, BufferSize);  
  24. Console.WriteLine("Reading data, {0} bytes ...", bytesRead);  
  25. //C#服務端程序  
  26. // 獲得請求的字符串  
  27. string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);  
  28. Console.WriteLine("Received: {0}", msg);  
  29. //C#服務端程序  
  30. // 按Q退出  
  31. }  

這段C#服務端程序的上半部分已經(jīng)很熟悉了,我就不再解釋。remoteClient.GetStream()方法獲取到了連接至客戶端的流,然后從流中讀出數(shù)據(jù)并保存在了buffer緩存中,隨后使用Encoding.Unicode.GetString()方法,從緩存中獲取到了實際的字符串。***將字符串打印在了控制臺上。這段代碼有個地方需要注意:在能夠讀取的字符串的總字節(jié)數(shù)大于BufferSize的時候會出現(xiàn)字符串截斷現(xiàn)象,因為緩存中的數(shù)目總是有限的,而對于大對象,比如說圖片或者其它文件來說,則必須采用“分次讀取然后轉存”這種方式,比如這樣:

 
 
 
  1. // 獲取字符串  
  2. byte[] buffer = new byte[BufferSize];  
  3. int bytesRead;  // 讀取的字節(jié)數(shù)  
  4. MemoryStream msStream = new MemoryStream();  
  5. do {  
  6. bytesRead = streamToClient.Read(buffer, 0, BufferSize);  
  7. msStream.Write(buffer, 0, bytesRead);  
  8. } while (bytesRead > 0);  
  9. //C#服務端程序  
  10. buffer = msStream.GetBuffer();  
  11. string msg = Encoding.Unicode.GetString(buffer); 

這里我沒有使用這種方法,一個是因為不想關注在太多的細節(jié)上面,一個是因為對于字符串來說,8192字節(jié)已經(jīng)很多了,我們通常不會傳遞這么多的文本。當使用Unicode編碼時,8192字節(jié)可以保存4096個漢字和英文字符。使用不同的編碼方式,占用的字節(jié)數(shù)有很大的差異,在本文***面,有一段小程序,可以用來測試Unicode、UTF8、ASCII三種常用編碼方式對字符串編碼時,占用的字節(jié)數(shù)大小。

現(xiàn)在對客戶端不做任何修改,然后運行先運行服務端,再運行客戶端。結果我們會發(fā)現(xiàn)這樣一件事:服務端再打印完“Client Connected!127.0.0.1:8500 <-- 127.0.0.1:xxxxx”之后,再次被阻塞了,而沒有輸出“Reading data, {0} bytes ...”??梢姡cAcceptTcpClient()方法類似,這個Read()方法也是同步的,只有當客戶端發(fā)送數(shù)據(jù)的時候,服務端才會讀取數(shù)據(jù)、運行此方法,否則它便會一直等待。

C#服務端程序的基本內容就向你介紹到這里,希望對你了解和學習C#服務端程序有所幫助。


名稱欄目:C#服務端程序實現(xiàn)同步傳輸字符串淺析
文章源于:http://www.dlmjj.cn/article/cdiisoe.html