国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C#網絡編程消息發送問題淺析

開發 后端
C#網絡編程消息發送問題是什么呢?C#網絡編程消息發送問題是如何解決的呢?那么本文就向你介紹相關的內容。

C#網絡編程消息發送問題:客戶端分兩次向流中寫入數據(比如字符串)時,我們主觀上將這兩次寫入視為兩次請求;然而服務端有可能將這兩次合起來視為一條請求,這在兩個請求間隔時間比較短的情況下尤其如此。同樣,也有可能客戶端發出一條請求,但是服務端將其視為兩條請求處理。下面列出了可能的情況,假設我們在客戶端連續發送兩條“Welcome to Tracefact.net!”,則數據到達服務端時可能有這樣三種情況:

三種情況 

NOTE:在這里我們假設采用ASCII編碼方式,因為此時上面的一個方框正好代表一個字節,而字符串到達末尾后為持續的0(因為byte是值類型,且最小為0)。

上面的***種情況是最理想的情況,此時兩條消息被視為兩個獨立請求由服務端完整地接收。第二種情況的示意圖如下,此時一條消息被當作兩條消息接收了:

一條消息被當作兩條消息接收 

而對于第三種情況,則是兩條消息被合并成了一條接收:

合并成了一條接收 

如果你下載了上一篇文章所附帶的源碼,那么將Client2.cs進行一下修改,不通過用戶輸入,而是使用一個for循環連續的發送三個請求過去,這樣會使請求的間隔時間更短,下面是關鍵代碼:

  1. string msg = "Welcome to TraceFact.Net!";  
  2.  
  3. for (int i = 0; i <= 2; i++) {  
  4. byte[] buffer = Encoding.Unicode.GetBytes(msg);  
  5.  // 獲得緩存  
  6. try {  
  7. streamToServer.Write(buffer, 0, buffer.Length);  
  8.  // 發往服務器  
  9. Console.WriteLine("Sent: {0}", msg);  
  10. catch (Exception ex) {  
  11. Console.WriteLine(ex.Message);  
  12. break;  
  13. }  

C#網絡編程之運行服務端,然后再運行這個客戶端,你可能會看到這樣的結果:

運行服務端 

運行客戶端 

可以看到,盡管上面將消息分成了三條單獨發送,但是服務端卻將后兩條合并成了一條。對于這些情況,我們可以這樣處理:就好像HTTP協議一樣,在實際的請求和應答內容之前包含了HTTP頭,其中是一些與請求相關的信息。我們也可以訂立自己的協議,來解決這個問題,比如說,對于上面的情況,我們就可以定義這樣一個協議:

[length=XXX]:其中xxx是實際發送的字符串長度(注意不是字節數組buffer的長度),那么對于上面的請求,則我們發送的數據為:“[length=25]Welcome to TraceFact.Net!”。而服務端接收字符串之后,首先讀取這個“元數據”的內容,然后再根據“元數據”內容來讀取實際的數據,它可能有下面這樣兩種情況:

NOTE:我覺得這里借用“元數據”這個術語還算比較恰當,因為“元數據”就是用來描述數據的數據。

“[“”]”中括號是完整的,可以讀取到length的字節數。然后根據這個數值與后面的字符串長度相比,如果相等,則說明發來了一條完整信息;如果多了,那么說明接收的字節數多了,取出合適的長度,并將剩余的進行緩存;如果少了,說明接收的不夠,那么將收到的進行一個緩存,等待下次請求,然后將兩條合并。
“[”“]”中括號本身就不完整,此時讀不到length的值,因為中括號里的內容被截斷了,那么將讀到的數據進行緩存,等待讀取下次發送來的數據,然后將兩次合并之后再按上面的方式進行處理。
接下來我們來看下如何來進行實際的操作,實際上,這個問題已經不屬于C#網絡編程的內容了,而完全是對字符串的處理。所以我們不再編寫服務端/客戶端代碼,直接編寫處理這幾種情況的方法:

  1. public class RequestHandler {  
  2. private string temp = string.Empty;  
  3.  
  4. public string[] GetActualString(string input) {  
  5. return GetActualString(input, null);  
  6. }  
  7.  
  8. private string[] GetActualString(  
  9. string input, List<string> outputList) {  
  10. if (outputList == null)  
  11. outputList = new List<string>();  
  12.  
  13. if (!String.IsNullOrEmpty(temp))  
  14. input = temp + input;  
  15.  //C#網絡編程
  16. string output = "";  
  17. string pattern = @"(?<=^\[length=)(\d+)(?=\])";  
  18. int length;  
  19.  
  20. if (Regex.IsMatch(input, pattern)) {  
  21.  
  22. Match m = Regex.Match(input, pattern);  
  23.  
  24. // 獲取消息字符串實際應有的長度  
  25. length = Convert.ToInt32(m.Groups[0].Value);  
  26.  
  27. // 獲取需要進行截取的位置  
  28. int startIndex = input.IndexOf(']') + 1;  
  29.  
  30. // 獲取從此位置開始后所有字符的長度  
  31. output = input.Substring(startIndex);  
  32.  
  33. if (output.Length == length) {  
  34. // 如果output的長度與消息字符串的應有長度相等  
  35. // 說明剛好是完整的一條信息  
  36. outputList.Add(output);  
  37. temp = "";  
  38. else if (output.Length < length) {  
  39. // 如果之后的長度小于應有的長度,  
  40. // 說明沒有發完整,則應將整條信息,包括元數據,全部緩存  
  41. // 與下一條數據合并起來再進行處理  
  42. temp = input;  
  43. // 此時程序應該退出,因為需要等待下一條數據到來才能繼續處理  
  44.  
  45. else if (output.Length > length) {  
  46. // 如果之后的長度大于應有的長度,  
  47. // 說明消息發完整了,但是有多余的數據  
  48. // 多余的數據可能是截斷消息,也可能是多條完整消息  
  49.  
  50. // 截取字符串  
  51. output = output.Substring(0, length);  
  52. outputList.Add(output);  
  53. temp = "";  
  54.  
  55. // 縮短input的長度  
  56. input = input.Substring(startIndex + length);  
  57.  
  58. // 遞歸調用  C#網絡編程
  59. GetActualString(input, outputList);  
  60. }  
  61. else {// 說明“[”,“]”就不完整  
  62. temp = input;  
  63. }  
  64.  
  65. return outputList.ToArray();  
  66. }  

這個方法接收一個滿足協議格式要求的輸入字符串,然后返回一個數組,這是因為如果出現多次請求合并成一個發送過來的情況,那么就將它們全部返回。隨后簡單起見,我在這個類中添加了一個靜態的Test()方法和PrintOutput()幫助方法,進行了一個簡單的測試,注意我直接輸入了length=13,這個是我提前計算好的。

  1. public static void Test() {  
  2. RequestHandler handler = new RequestHandler();  
  3. string input;  
  4.  
  5. // ***種情況測試 - 一條消息完整發送  
  6. input = "[length=13]明天中秋,祝大家節日快樂!";  
  7. handler.PrintOutput(input);  
  8.  
  9. // 第二種情況測試 - 兩條完整消息一次發送  
  10. input = "明天中秋,祝大家節日快樂!";  
  11. input = String.Format  
  12. ("[length=13]{0}[length=13]{0}", input);  
  13. handler.PrintOutput(input);  
  14.  
  15. // 第三種情況測試A - 兩條消息不完整發送  
  16. input = "[length=13]明天中秋,祝大家節日快樂![length=13]明天中秋";  
  17. handler.PrintOutput(input);  
  18.  
  19. input = ",祝大家節日快樂!";  
  20. handler.PrintOutput(input);  
  21.  //C#網絡編程
  22. // 第三種情況測試B - 兩條消息不完整發送  
  23. input = "[length=13]明天中秋,祝大家";  
  24. handler.PrintOutput(input);  
  25.  
  26. input = "節日快樂![length=13]明天中秋,祝大家節日快樂!";  
  27. handler.PrintOutput(input);  
  28.  //C#網絡編程
  29.  
  30. // 第四種情況測試 - 元數據不完整  
  31. input = "[leng";  
  32. handler.PrintOutput(input); // 不會有輸出  
  33.  
  34. input = "th=13]明天中秋,祝大家節日快樂!";  
  35. handler.PrintOutput(input);  
  36.  
  37. }  
  38.  
  39. // 用于測試輸出  
  40. private void PrintOutput(string input) {  
  41. Console.WriteLine(input);  
  42. string[] outputArray = GetActualString(input);  
  43. foreach (string output in outputArray) {  
  44. Console.WriteLine(output);  
  45. }  
  46. Console.WriteLine();  

C#網絡編程運行上面的程序,可以得到如下的輸出:

輸出結果 

OK,從上面的輸出可以看到,這個方法能夠滿足我們的要求。對于這篇文章最開始提出的問題,可以很輕松地通過加入這個方法來解決,這里就不再演示了。

C#網絡編程消息發送方面的內容就向你介紹到這里,希望對你了解和學習C#網絡編程有所幫助。

【編輯推薦】

  1. C#異步調用的應用實踐淺談
  2. 委托實現C#異步調用淺析
  3. 淺析C#中異步和多線程的區別
  4. C# Socket通信三大問題詳解
  5. C#異步調用四大方法詳解
責任編輯:仲衡 來源: 博客園
相關推薦

2009-07-30 18:50:32

C#發送消息C#應用程序

2009-08-21 14:47:39

C#網絡編程

2009-08-21 17:19:36

C#網絡編程入門

2009-08-27 14:12:02

C# interfac

2009-09-03 17:40:25

C#發送短信

2009-08-21 10:17:14

C#異步網絡編程

2009-08-20 17:30:56

C#異步編程模式

2009-09-03 17:10:57

2009-08-21 17:53:25

C#網絡編程客戶端程序

2009-08-21 17:48:43

C#網絡編程

2009-09-04 18:16:19

C# Main參數C# Main

2009-01-16 09:58:07

C#編程C#內存管理垃圾收集

2009-08-31 17:02:28

C#接口編程

2009-03-10 13:59:41

C#套接字編程

2009-08-17 18:34:50

C# ChangeCo

2009-08-14 17:45:52

C# ArrayLis

2009-08-25 15:52:27

C#工具欄

2009-08-21 17:39:20

服務器端程序C#網絡編程

2009-08-21 17:33:34

服務器端程序C#網絡編程

2009-08-20 17:47:54

C#異步編程模式
點贊
收藏

51CTO技術棧公眾號

国产亚洲制服色| 91亚洲大成网污www| 国产一区二区三区直播精品电影| 99精品视频播放| 一本色道久久| 欧日韩不卡在线视频| 第84页国产精品| 午夜影院久久久| 黄色大片中文字幕| 亚洲区国产区| 国产精品av电影| 日韩成人18| 精品国产凹凸成av人网站| 四虎永久在线| 久久五月婷婷丁香社区| 欧洲精品码一区二区三区免费看| 一本色道久久综合狠狠躁的番外| 亚洲午夜av电影| 成人爽a毛片免费啪啪动漫| 疯狂欧美牲乱大交777| 天天干天天综合| av一区二区三区四区| 亚洲福利av| 久久成人一区| 久久视频在线观看中文字幕| 欧美精品一区二区三区精品| 欧美激情影音先锋| 国产精品久久久久久久久久辛辛| 日韩精品极品在线观看播放免费视频| av大片在线看| 欧美性xxxxxx少妇| 欧美69xxxxx| 亚洲v中文字幕| 视频免费观看| 一区二区三区 在线观看视频| aa免费在线观看| 91玉足脚交白嫩脚丫在线播放| 日韩精品一区二区三区电影| 久久国产精品99精品国产| 日本一区二区视频| 日本va欧美va欧美va精品| 久久亚洲国产精品日日av夜夜| 99精品热6080yy久久| 久久riav| 美腿丝袜亚洲一区| 四虎免费在线观看视频| 国产一区二区三区蝌蚪| 欧美一级免费在线观看| 国产美女主播视频一区| 日韩一级片一区二区| www.色精品| 亚洲综合欧美激情| 亚洲黄色av一区| 香蕉网站在线| 欧美日韩一区二区在线观看| 日本亚洲精品| 日韩激情av在线免费观看| 神马久久午夜| 日韩亚洲第一页| 深夜激情久久| 国产精品久久激情| 亚洲成人中文| 亚洲午夜精品一区二区| eeuss国产一区二区三区| 香蕉521av成人网| 亚洲国产精品久久人人爱蜜臀 | 2020国产精品极品色在线观看| 久久艹在线视频| 日韩精品免费一区二区三区竹菊| 国产精品毛片a∨一区二区三区|国| 亚洲一级淫片| 中文字幕久久综合| 欧美韩国一区二区| 欧美新色视频| 精品视频偷偷看在线观看| 欧美激情三级| 91精品在线观| 韩国v欧美v亚洲v日本v| 欧美三级午夜理伦三级富婆| 欧美小视频在线| 日本免费一区二区三区四区| 久久全国免费视频| 欧美福利在线| 国产真实老熟女无套内射| 一区二区三区日韩欧美精品| 成人黄色网址| 久久久久久久香蕉网| 一本综合精品| 日韩在线第三页| 欧美日韩综合不卡| 亚洲精品一区二区三区中文字幕| 51午夜精品| 久久只精品国产| 久久bbxx| 8050国产精品久久久久久| 国产视频一区免费看| 亚洲人成色77777| 欧美精品高清视频| 奇米影视777在线欧美电影观看 | 九义人在线观看完整免费版电视剧| 亚洲精品中文字| 国产成人精品999在线观看| 亚洲高清视频一区| 亚洲激情五月婷婷| 一呦二呦三呦精品国产| 国产一区二区香蕉| 久久先锋资源网| 美洲精品一卡2卡三卡4卡四卡| 国产精品素人视频| gogo亚洲高清大胆美女人体| 久久久黄色av| 国产美女撒尿一区二区| 欧美亚洲视频在线观看| 免费观看欧美大片| 91精品国产99久久久久久| 成人在线高清| 婷婷久久青草热一区二区| 欧美三级电影在线播放| 久久久久88色偷偷免费| 麻豆免费在线观看| 欧美亚洲激情在线| 国模一区二区三区白浆| 高清av在线| 日韩美女在线看| 成人网在线播放| 在线观看a级片| 亚洲mm色国产网站| 国产精品剧情在线亚洲| 日本在线中文字幕一区二区三区| 国产亚洲精品自在久久| 午夜精品久久久久久久久| 美女视频亚洲色图| 日本中文字幕网址| 日韩av在线直播| 99综合视频| 毛片免费在线| 国产精品久久久久久久久久久久| 久久影音资源网| 亚洲精品555| 日本精品免费视频| 精品国免费一区二区三区| 国自产拍偷拍福利精品免费一| 交视频在线观看国产| 久久久久久久一区二区| 成人黄色av电影| 成年美女黄网站色大片不卡| 一区不卡视频| 日韩国产欧美精品一区二区三区| 美女国产一区| av在线看片| 神马一区二区影院| 日韩欧美一二三四区| 久久高清一区| 韩国av网站在线| 久久综合婷婷综合| 欧美一区二区视频在线观看 | 青春草在线免费视频| 国产精品一码二码三码在线| 黄色精品一区二区| 一区二区三区午夜探花| 在线播放色视频| 亚洲在线观看视频| 欧美色图在线观看| 亚洲欧美日韩综合国产aⅴ| 最爽无遮挡行房视频在线| 日韩精品欧美专区| 日韩毛片在线看| av亚洲精华国产精华精华| 日本高清精品| 丝袜国产免费观看| 99一区二区| 亚洲精品一区二区三区99| 国产精品一区二区久久不卡| 亚洲黑人在线| 九色丨porny丨自拍入口| 国产精品∨欧美精品v日韩精品| 偷拍日韩校园综合在线| 欧美精品一线| tube8在线hd| 欧美v在线观看| 国产福利视频一区| 欧美一a一片一级一片| 欧美aa在线视频| 亚洲国产精选| 成年网站免费| 国产精品国产三级欧美二区| 日韩一二三区视频| 91在线免费播放| 久久婷婷蜜乳一本欲蜜臀| 日本最新在线视频| 超碰成人免费在线| 国产精品一区二区久久久| 日韩欧美一级在线播放| 久久久久国产精品免费免费搜索| 欧美一区二区三区高清视频| 国产在线激情视频| 日韩精品视频久久| 91丝袜脚交足在线播放| 国产亚洲欧洲高清| 欧美日韩色婷婷|