C#網路編程(非同步傳輸字串)

來源:互聯網
上載者:User

這篇文章我們將前進一大步,使用非同步方式來對服務端編程,以使它成為一個真正意義上的伺服器 :可以為多個用戶端的多次請求服務。但是開始之前,我們需要解決上一節中遺留的一個問題。

訊息發送時的問題

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

NOTE:在這裡我們假設採用ASCII編碼方式,因為此時上面的一個方框正好代表一個位元組,而字串到 達末尾後為持續的0(因為byte是實值型別,且最小為0)。

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

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

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

string msg = "Welcome to TraceFact.Net!";

for (int i = 0; i <= 2; i++) {
    byte[] buffer = Encoding.Unicode.GetBytes(msg);     // 獲得緩衝
    try {
        streamToServer.Write(buffer, 0, buffer.Length); // 發往伺服器
        Console.WriteLine("Sent: {0}", msg);
    } catch (Exception ex) {
        Console.WriteLine(ex.Message);
        break;
    }
}

運行服務端,然後再運行這個用戶端,你可能會看到這樣的結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.