C#- Networking Programming

Phần lớn các thư viện về network nằm trong package System.Net, sử dụng các giao thức chuyên dụng như HTTP, TCP/IP và FPT. Dưới đây là một số lớp hay được sử dụng:
– WebClient: download và upload thông qua giao thức HTTP hoặc FTP.
– WebRequest và WebResponse low-level control HTTP, FTP.
– HttpClient for consuming HTTP web APIs and RESTful services.
– HttpListener for writing an HTTP server.
– SmtpClient for constructing and sending mail messages via SMTP.
– Dns for converting between domain names and addresses.
– TcpClientUdpClientTcpListener, and Socket classes for direct access to the transport and network layers.

Hầu hết các lớp này đều làm việc dưới tầng transport (TCP,UDP) và tầng application (HTTP,FPT,SMTP,DNS).


Sau đây chúng ta sẽ tìm hiểu các class cho các mục đích chúng ta hay dùng!
– WebRequest và WebResponse là 2 lớp hay được sử dụng nhất, nó có thể làm việc được với cả HTTP và FTP.
– WebClient có chức năng của cả 2 lớp trên, dùng rất tiện. Nó cho phép ta làm việc với đủ các loại dữ liệu string, file, bytes, stream trong khi đó WebRequest và WebResponse chỉ làm việc được với stream.
– HttpClient (bao gồm cả HttpWebRequest và HttpWebResponse) cũng được xây dựng từ 2 lớp trên. Nó được cung cấp thêm các chức năng để làm việc với HTTP-based web API, REST-based service.
– Với công việc như download.upload file string hoặc bytes đều có thể dùng bằng HttpClient hoặc WebClient.

Đặc biệt WebClient không sử dụng được cho WinRT, do đó ta phải dụng WebRequest/WebResponse hoặc HttpClient.

1. WebClient

– Các platform khác có thể sử dụng bình thường.
– Riêng đối với WP8.0 thì nó chỉ còn phương thức DownloadStringAsync, do đó mà ta cần phải lấy chuỗi string trả về trong eventDownloadStringCompleted, điều đó cũng tương ứng với việc ta cũng phải tạo 1 event bên ngoài để gọi vào khi download string xong:
//Tạo event cho bên ngoài subcribe
delegate void DownLoadXong(String s);
//Download string
        public static void GetListContestAsync(string url)
        {
            WebClient client = new WebClient();
            client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
            client.DownloadStringCompleted += client_DownloadStringCompleted;
        }
//Event
        static void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (downxong != null) 
                 downxong(e.Result);
        }

2. HttpClient

Platforms Supported: WP8.1,W8.1
Hãy thử tạo một đối tượng của lớp này và đánh .Get xem bạn có thể tận dụng được những gì từ nó!
public static async void GetStringAsync(string url)
    {
       string html = await new HttpClient().GetStringAsync(url);
        Debug.WriteLine(html);
     }

3. WebRequest/WebResponse

Platforms Supported: WP8.0
Hai lớp trên rất tiện lợi nhưng trong một số trường hợp ta sẽ không thể sử dụng được, lúc đó thì bắt buộc phải sử dugj đến 2 lớp này!
Các bước sử dụng như sau:
public static async Task GetListContestAsync(string url)
{
    WebRequest request = WebRequest.Create(url);
    using (WebResponse response = await request.GetResponseAsync())
    {
        using (Stream stream = response.GetResponseStream())
        {
            //Do something with stream
        }
    }
}

Bonus: String Stream

public Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}
//
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
stackoverflow...more :D 
Method 1: Legacy

using System.Net;
POST
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");

var postData = "thing1=hello";
    postData += "&thing2=world";
var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
GET
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");

var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

Method 2: WebClient (Also now legacy)
using System.Net;
using System.Collections.Specialized;
POST
using (var client = new WebClient())
{
    var values = new NameValueCollection();
    values["thing1"] = "hello";
    values["thing2"] = "world";

    var response = client.UploadValues("http://www.example.com/recepticle.aspx", values);

    var responseString = Encoding.Default.GetString(response);
}
GET
using (var client = new WebClient())
{
    var responseString = client.DownloadString("http://www.example.com/recepticle.aspx");
}

Method 3: HttpClient
Currently the preferred approach. Asynchronous. Ships with .NET 4.5; portable version for other platforms available via NuGet.
using System.Net.Http;
POST
using (var client = new HttpClient())
{
    var values = new Dictionary<string, string>
    {
       { "thing1", "hello" },
       { "thing2", "world" }
    };

    var content = new FormUrlEncodedContent(values);

    var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);

    var responseString = await response.Content.ReadAsStringAsync();
}
GET
using (var client = new HttpClient())
{
    var responseString = client.GetStringAsync("http://www.example.com/recepticle.aspx");
}

Method 4: 3rd-Party Libraries
Tried and tested library for interacting with REST APIs. Portable. Available via NuGet.
Newer library sporting a fluent API and testing helpers. HttpClient under the hood. Portable. Available via NuGet.
using Flurl.Http;
POST
var responseString = await "http://www.example.com/recepticle.aspx"
    .PostUrlEncodedAsync(new { thing1 = "hello", thing2 = "world" })
    .ReceiveString();
GET
var responseString = await "http://www.example.com/recepticle.aspx"
    .GetStringAsync();

Không có nhận xét nào :

Đăng nhận xét