24/05/2018, 20:26

Khả năng kết nối mạng bằng .Net Compact Framework

Socket là chuẩn cho truyền thông với các máy tính trên mạng cục bộ (LAN) và mạng diện rộng (WAN), giống như là Internet. Hai máy tính giao tiếp với mỗi máy khác bằng cách sử dụng socket, sau đó nó trở thành giao thức phổ biến khi mà ...

Socket là chuẩn cho truyền thông với các máy tính trên mạng cục bộ (LAN) và mạng diện rộng (WAN), giống như là Internet. Hai máy tính giao tiếp với mỗi máy khác bằng cách sử dụng socket, sau đó nó trở thành giao thức phổ biến khi mà một máy tính đang mong chờ kết nối để nhận một kết nối, và một máy khác tạo kết nối khởi tạo.

 Máy tính mong chờ nhận một kết nối, host hoặc server, lắng nghe kết nối vào trên một cổng nào đó. Máy tính có một địa xhỉ IP duy nhất, giống như là 172.68.112.34, và hàng nghìn cổng sẵn sàng, nó sẵn sang cho nhiều chương trình cùng lắng nghe kết nối, mỗi kết nối sử dụng một cổng riêng.

 Máy tính tạo ra khởi tạo kết nối (client), xác định địa chỉ IP của máy mong chờ kết nối (server). Nếu biết được tên của máy mong chờ kết nối như là www.mycomputer.org, chúng ta có thể sử dụng DNS tra cứu để xác định địa chỉ IP liên quan đến tên.

 Client quyết định cổng nào kết nối với host. Ví dụ: Web servers luôn luôn lắng nghe trên cổng 80, vì vậy máy tính muốn kết nối với máy Web server khác quá trình luôn biết nó cần thiết kết nối trên cổng 80. Ứng dụng thường sử dụng một lượng lớn các cổng không giống nhau, được sử dụng bởi bất kỳ ai, như là 10998. Phạm vi số hiệu cổng mà ứng dụng có thể sử dụng phụ thuộc vào hệ điều hành. Một số hệ điều hành dự trữ một số số hiệu cổng đặc biệt, ví dụ 1024. Để an toàn nên chọn các cổng từ 2000 và 60000.

 Client có thể kết nối tới địa chỉ IP và số hiệu cổng. Host nhận kết nối. Khi đó tồn tại một kết nối socket giữa hai máy tính.

 Client và host gửi các gói dữ liệu qua lại.

Trong phần này chúng ta học cách thao tác kết nối socket bằng .NET Compact Framework.

Giao thức: TCP/IP, UDP

Tổng quan, lập trình socket sử dụng giao thức Internet để gửi các gói tin giữa hai máy. Có hai kiểu gói tin sử dụng để gửi dữ liệu thông qua giao thức Internet:

Gói tin TCP:

Đây là kiểu gói tin thường được sử dụng trên Internet để truyền dữ liệu đi xa, giao thức của gói tin TCP trên giao thức Internet gọi là mạng TCP/IP. Nếu một máy tính gửi một gói tin TCP qua một kết nối Socket, dữ liệu trong gói đó được bảo đảm tới đích mà không có lỗi. Nếu gói tin tới đích nhưng có lỗi, sau đó dữ liệu lại được gửi lại. Nếu gói tin không tới đích trong khoảng thời gian cho phép, sau chức năng thường được gọi để gửi báo báo gói tin có lỗi. Cách kiểm tra lỗi thay đổi tuỳ theo từng nền tảng (platform), nhưng chúng ta sẽ nghiên cứu quá trình xử lý này chi tiết cho .NET Compact Framework.

Gói tin UDP

Gói tin này khác với gói tin TCP, bởi vì nó không đảm bảo gói UDP sẽ tới đích hoặc dữ liệu sẽ không có lỗi. Tuy nhiên, sự thiếu đi quá trình kiểm tra lỗi có nghĩa là sử dụng gói tin UDP làm cho phần đầu của gói tin nhỏ hơn, vì vậy chương trình có thể truyền dữ liệu nhanh hơn. Một ứng dụng tốt sử dụng gói tin UDP là điện thoại Internet.

Sự thực thi của IP: IPv4 hay IPv6

Quá trình xử lý của kết nối máy khách tới máy chủ bao gồm xác định địa chỉ IP của máy chủ và sau đó tạo kết nối. Sự phức tạp của quá trình truyền đi và truyền lại đúng địa chỉ là trách nhiệm của giao thức Internet. Giao thức này có một vài phiên bản. Giao thức Internet phiên bản 4, IP4 là phổ biến nhất được sử dụng trên Internet. Một địa chỉ IPv4 bao gồm bốn phần 8 bít. Một địa chỉ IPv4 gồm bốn phần, mỗt phần bao gồm các số thập phân từ 0 đến 255, các phần được cách nhau bởi dấu

“.”
, giống như là
172.68.112.34
.

Ngày nay để kết nối với thế giới, IPv4 không cung cấp đủ địa chỉ duy nhất cho mỗi máy tính.

Phiên bản mới nhất của giao thức IP là 6, thường viết là IPv6. Nó không được sử dụng phổ biến. IPv6 bao gồm tăng cường tính bảo mật và địa chỉ. IPv6 sẽ cung cấp đủ địa chỉ IP duy nhất cho mỗi máy tính trong tương lai.

.NET Compact Framework hỗ trợ nhiều hơn cho phiên bản trước (IPv4). Nó không hỗ trợ giao thức IPv6. Trong phần này chúng ta chỉ tìm hiểu về giao thức IPv4.

Lớp

System.Net.Sockets.Socket
. Thủ tục để nhận một lớp Socket kết nối với máy ở xa phụ thuộc vào máy tính đó, tuy nhiên quá trình xử lý để đọc và ghi dữ liệu là giống nhau.

Để sử dụng các lớp xử lý mạng trong .NET Compact Framework, chúng ta phải khai báo không gian tên System.Net. Ví dụ: using System.Net.

Tạo kết nối từ máy khách tới máy chủ (client)

Để tạo một kết nối thành công, trước tiên chúng ta phải tìm hiểu lớp

System.Net.EndPoint
. Để lưu giữ thông tin về điểm cuối nơi mà kết nối đến: địa chỉ IP của máy chủ và số hiệu cổng mong muốn. Để thiết lập đúng điểm cuối và sử dụng nó để kết nối socket tới máy chủ, chúng ta làm theo các bước sau:

c 1: Khai báo biến điểm cuối (EndPoint) và biến Socket.

c2: Điểm cuối gồm thông tin địa chỉ và số hiệu cổng. Có hai cách để làm điều này, phụ thuộc vào địa chỉ của máy chủ, giống như là:

172.68.25.34
, hoặc tên DSN của máy chủ, như là www.mycomputer.net.

Tìm địa chỉ IP của một máy chủ:

Nếu chúng ta biết địa chỉ IP của máy chủ, sử dụng

IPAddress
trong cấu trúc. Ví dụ sau mô tả khởi tạo một điểm cuối, máy chủ có địa chỉ IP là
172.68.25.34
, và cổng 9981:
EndPoint l_EndPoint = new IPEndPoint( IPAddress.Parse( "172.68.25.34"), Convert.ToInt16(9981));
    

Nếu chúng ta không biết địa chỉ IP, chúng ta phải dùng DSN để tìm địa chỉ IP của máy chủ thông qua tên. DSN tìm kiếm trả lại địa chỉ IP tương ứng với tên. Đoạn mã sau là một trường hợp:

IPHostEntry l_IPHostEntry = Dns.Resolve("www.mycomputer.net");
    EndPoint l_EndPoint = new IPEndpoint(l_IPHostEntry.AddressList[0],9981);
    

c3: Sử dụng điểm cuối (EndPoint) để thử kết nối socket tới máy chủ. Chúng ta phải sử dụng mệnh đề try/catch ở đây, bởi vì thử kết nối sẽ đưa ra một ngoại lệ nếu có vấn đề, như máy chủ từ chối không chấp nhận kết nối hoặc máy chủ không tồn tại,...

Ví dụ sau mô tả ba bước ở trên:

try
    {
    Socket l_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    l_Socket.Connect(l_EndPoint);
    if (l_Socket.Connected){
    // l_Socket bầy giờ có thể gửi và nhận dữ liệu
    
   }
    }
    catch (SocketException e)
    { /* Đưa ra thông báo lỗi,… */ }
    

Tạo kết nối từ máy chủ lằng nghe từ máy khách (Host)

Chúng ta có thể thu được một kết nối socket từ máy tính ở xa bằng cách đảm nhiệm như là máy chủ. Khi một thiết bị như máy chủ, nó đợi nhận kết nối từ các máy khách. Để tạo kết nối để thiết bị của chúng ta như là máy chủ, chúng ta phải thiết lập một socket lắng nghe trên một cổng đến khi một ai đó gửi một yêu câu kết nối đến thiết bị của chúng ta. Sau đây là các bước tạo socket lắng nghe trên một cổng để cho máy khác kết nối tới:

c 1: Tạo một socket để lắng nghe kết nối.

c2: Ràng buộc socket lắng nghe trên một cổng. Nó chỉ lắng nghe kết nối trên một cổng.

c3: Gọi Accept() trên socket lắng nghe nhận được từ socket khác khi một ai đó kết nối tới. Đoạn mã có thể đọc và ghi socket nhận được, và socket tiếp tục đợi kết nối mới.

Ví dụ sau mô tả ba bước ở trên:

m_listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
m_listenSocket.Bind(new IPEndPoint(IPAddress.Any, 8758));
 m_listenSocket.Listen((int)SocketOptionName.MaxConnections);
 m_connectedSocket = m_listenSocket.Accept();
if (m_connectedSocket != null)
{
if (m_connectedSocket.Connected)
{
// Someone has connected to us.
}
}

Gửi và nhận trên Socket đã kết nối

Một socket được kết nối tới máy tính ở xa. Nó có thể sử dụng gửi và nhận dữ liệu. Cách đơn giản nhất để làm việc này là gọi

Socket.Send()
để gửi dữ liệu và
Socket.Receive()
nhận dữ liệu.

Gửi dữ liệu vào một Socket cùng với Socket.Send

Socket.Send()
có bốn thành phần nạp chồng, mỗi thành phần là một mức khác nhau của điều khiển thông qua cái được gửi:

-

Send(Byte[] buffer)
: Gửi tất cả mội thứ bên trong mảng byte buffer.

-

Send(Byte[] buffer, SocketFlags socketFlags)
Gửi tất cả mọi thứ trong buffer cùng với sự hạn chế riêng thông qua cách dữ liệu đi như thế nào.

-

Send(Byte[] buffer, Int32 size, SocketFlags socketFlags)
: Gửi tất cả dữ liệu trong buffer tuỳ theo kích cỡ
size
. Nếu chúng ta muốn gửi chỉ một phần của một buffer, sau đó có thể chỉ rõ
SocketFlags.None
sử dụng mặc định hành vi gửi. Ví dụ, để gửi 16 byte đầu tiền của mảng, chúng ta có thể sử dụng
l_Socket.Send(l_buffer, 16, SocketFlags.None)
.

-

Send(Byte[] buffer, Int32 offset Int32 size, SocketFlags socketFlags)
: Giống như thành phần trên chỉ khác là chúng ta có thể chỉ rõ chỉ số bắt đầu của mảng. Ví dụ, để gửi từ byte tứ 3 đến bute thứ 7 của mảng, chúng ta có thể sử dụng như sau:
l_Socket.Send(l_buffer, 2, 6, SocketFlags.None);
    

Phương thức Send trả vể số byte gửi thành công. Vấn đề này cùng với phương thức

send()
dường như giống nhau rất nhiều việc biến đổi tất cả mọi cái chúng ta muốn gửi vào mảng các byte để gửi thông qua socket. .NET Compact Framework hỗ trợ hai lớp rất hữu ích,
System.Text.Encoding
System.Convert
, hai lớp này giúp chuyển đổi kiểu dữ liệu cơ bản thành mảng các byte để có thể gửi qua socket.

Cách dễ nhất để tìm hiểu cách sử dụng lớp

Encoding
Convert
là xem ví dụ. Sau đây là ví dụ socket có tên là
l_Socket
đã tồn tại và đã được kết nối:

 Gửi một chuỗi sử dụng mã hoá ASCII :

l_Socket.Send(Encoding.ASCII.GetBytes("Send me")
    

 Gửi một chuỗi sử dụng mã hoá Unicode:

l_Socket.Send(Encoding.Unicode.GetBytes("Send me")
    

 Gửi một số nguyên có giá trị 2003:

l_Socket.Send(Encoding.ASCII.GetBytes(Convert.ToString(2003))
    

 Gửi một số thực có giá trị 2.7:

l_Socket.Send(Encoding.ASCII.GetBytes(Convert.ToString(2.71))
    

Nhận dữ liệu từ từ socket bằng Socket.Receive

Nhận dữ liệu từ một socket thông qua phương thức

Socket.Receive.
Receive có bốn thành phần nạp chồng, giống như thành phần nạp chồng của
Socket.Send
. Mỗi thành phần nạp chồng trả về số byte đọc thành công:

-

Receive (Byte[] buffer)
: Thành phần này nhận dữ liệu trong bộ đệm.

-

Receive (Byte[] buffer, SocketFlags socketFlags)
Thành phần này nhận dữ liệu trong bộ đệm bằng cách sử dụng cờ để chỉ ra dữ liệu được lấy như thế nào.

-

Receive (Byte[] buffer, Int32 size, SocketFlags socketFlags)
Thành phần này nhận tuỳ theo kích cữ của dữ liệu trong bộ đệm. Nếu dữ liệu nhiều hơn dữ liệu sẵn sàng, nó được bỏ qua. Chúng ta có thể nhận dữ liệu còn lại bằng cách gọi lại
Receive.
Nếu chúng ta chỉ muốn nhận những byte mà chúng ta không nhận được, sau đó chúng ta có thể chỉ
SocketFlags.None
để sử dụng mặc định cho hành động gửi. Ví dụ để nhận 16 byte đầu tiên của dữ liệu sẵn sàng, sử dụng
l_Socket.Receive(l_buffer, 16, SocketFlags.None)

- Receive (Byte[] buffer, Int32 offset Int32 size, SocketFlags socketFlags) Thành phần này giống như thành phần trước, chỉ khác là chúng ta có thể chỉ ra chỉ số trong mảng để sử dụng bắt đầu ghi dữ liệu vào mảng. Ví dụ, để nhận 7 byte dữ liệu trong bộ đệm bắt đầu từ vị trí thứ 3 trong bộ đệm, sử dụng đoạn mã sau:

l_Socket.Receive(l_buffer, 2, 6, SocketFlags.None);
    

Có kỹ thuật cho phép chuyển đổi dữ liệu để gửi từ socket ra mảng, kỹ thuật đơn giản nhất là chuyển đổi mảng byte trong kiểu dữ liệu cơ bản. Như phần trước, lớp

Encoding
Convert
cung cấp phương tiện cho chuyển đổi, và chúng ta sẽ xem trong ví dụ. Đầy là ví dụ thừa nhận dữ liệu đã được nhận trong mảng Byte có tên là
l_Buffer
:

 Chuyển đổi các byte nhận được trong một chuỗi ASCII :

string l_ASCII = Encoding.ASCII.GetString(l_Buffer);
    

 Chuyển đổi các nhận được trong một chuỗi Unicode:

string l_ASCII = Encoding.Unicode.GetString(l_Buffer); 
    

 Chuyển đổi các byte nhận được, cái đó là mã ASCII text integer:

int l_Integer = Convert.ToInt32(Encoding.ASCII.GetString(l_Buffer));
    

 Chuyển đổi các byte nhận được, cái đó là mã ASCII text integer, into a Double:

Double l_Double = Convert.ToInt32(Encoding.ASCII.GetString(l_Double));
    

Bảng 3.1. Danh sách các thành phần chuyển đổi được hỗ trợ bởi lớp

Convert
trên .NET Compact Framework.

Bảng 3.1. Lớp Convert trên .NET Compact Framework

Phiển bản desktop của .NET Framework cho phép tuần tự hóa hầu hết kiểu đối tượng thành mảng các byte, để có thể gửi qua socket. Các đối tượng phức tạp, người phát triển thực thi giao diện

ISerializable
, cùng với mã tuần tự (serialize) và hồi phục (deserialize) đối tượng dữ liệu.

.NET Compact Framework không hỗ trợ những chức năng này. Lớp

DataSet
là lớp duy nhất có thể tự tuần tự hóa. Thông thường lớp
DataSet
được sử dụng như là một cơ sở dữ liệu quan hệ trong bộ nhớ. Nó là một ý tưởng cho bộ đệm dữ liệu nhỏ dựa vào máy chủ ở xa trong khi duy trì cấu trúc quan hệ của dữ liệu.
 DataSet
có thể lưu trữ tất cả các kiểu dữ liệu cơ bản trên .NET Compact Framework.

Như đã đề cập, có hai kiểu gói tin thường được sử dụng để truyền tin trên mạng. Kiểu chung nhất, gói TCP phải chọn cho gần như tất cả các trường hợp bởi vì nó đảm bảo rằng dữ liệu đến không bị hư hỏng hoặc ngược lại trả lại tín hiệu lỗi nếu có một vấn đề gì mà không thể sửa chữa.

Gói tin UDP rất hữu ích cho các ứng dụng dòng thời gian thực.

Gói tin UDP khác gói tin TCP trong cách mà chúng kết nối, giao thức TCP là giao thức hướng kết nối, điều này có nghĩa là chúng ta cần kết nối với một socket trên máy tính ở xa trước khi chúng ta có thể gửi hoặc nhận dữ liệu bằng socket. Giao thức kết nối không yêu cầu bất kỳ kết nối nào được thiết lập trước khi có gắn gửi hoặc nhận dữ liệu. Nếu không có một lắng nghe trên địa chỉ IP và cổng nơi mà gói UDP được gửi, sau đó gói tin đơn giản là bị mất.

Cách đơn giản nhất đển làm việc với gói UDP là sử dụng lớp

UdpClient
, lớp này được .NET Compact Framework hỗ trợ. Lớp
UdpClient
cho phép các lập trình viên gửi các byte tới nhóm ở xa.
UdpClient
cho phép người phát triển nhận byte từ nhóm ở xa hoặc từ bất kỳ người nào cố gắng gửi dữ liệu tới cổng mà
UdpClient
lắng nghe. Quan tâm đến các cấu trúc và phương thức được
UdpClien
t sử dụng sau:

-

void Connect(String hostname, Int32 port)
Thiết lập kết nối tới một máy tính có địa chỉ IP tương ứng được chỉ ra bởi tên máy chủ (hostname) và số hiệu cổng (port). Sau đó sử dụng phương thức
Send(Byte[] dgram, Int32 bytes)
sẽ gửi dữ liệu đến vị trí được chỉ ra trong phân kết nối. Phương thức này trả về kiểu void bởi vì không có khái niệm kết nối thành công khi sử dụng gói UDP. Phương thức này chỉ đơn thuần là tạo để gửi dữ liệu tới một địa chỉ IP và số hiệu cổng.

-

void Connect(IPAddress addr, Int32 port)
Giống như phương thức trước, ngoại trừ cho phép bạn chỉ ra máy tính ở xa bằng
IPAddress
port
. Đoạn mã ví dụ:
l_UdpClient.Connect(IPAddress.Parse("172.68.25.34"), 9981)
    
  • void Connect(IPEndpoint endPoint) 
    Kết nối với máy ở xa bằng cách chỉ ra
    endPoint
    .

-

Int32 Send(Byte[] dgram, Int32 bytes, IPEndPoint endPoint)
Gửi tất cả
bytes
của bộ đệm
dgram
tới máy tính có địa chỉ IP và cổng được chỉ ra trong
endPoint
.

-

Send(Byte[] dgram, Int32 bytes, String hostname, Int32 port)
Gửi tất cả các
bytes
của bộ đệm
dgram
tới máy tính có địa chỉ IP tương ứng với
hostname
và cổng, như trong đoạn mã ví dụ sau:
Send(aBuffer, aBuffer.Length, "www.mycomputer.net", 9981)
    

Phương thức trên trả về số byte gửi.

-

Send(Byte[] dgram, Int32 bytes)
Gửi tổng số byte của bộ đệm tới máy chủ ở xa đươc chỉ ra trong phương thức kết nối. Để sử dụng thành phần nạp chồng, chúng ta trước tiền phải gọi
Connect
, vì vậy
UdpClient
biết nơi gửi gói UDP. Phương thức này trả về số byte gửi được.
  • Receive(ref IPEndPoint remoteEP)
    Đợi để nhận dữ liệu từ
    EndPoint
    . Chúng ta có thể tạo một
    EndPoint
    tham chiếu đến một địa chỉ IP và cổng, hoặc chúng ta có thể thiết lập
    EndPoint
    để nhận dữ liệu từ bất kỳ địa chỉ IP và port.
    EndPoint
    được cập nhật sau khi dữ liệu được nhận cho biết nơi dữ liệu đến.

Viết mã cho

UdpClient

Đoạn mã này mô tả cách thiết lập một

UdpClient
, sau đó gửi gói tin UDP tới máy tính có địa chỉ IP là
192.168.0.200
, cổng 8758. Chú ý là thông qua gọi phương thức
UdpClient.Connect(). UdpClient
biết nơi gửi gói tin UDP khi
UdpClient.Send()
được gọi, nhưng không có kết nối liên tục.
IPEndPoint senderIP = new IPEndPoint(IPAddress.Parse("192.168.0.200"), Convert.ToInt32(8758));
    UdpClient l_UdpClient = new UdpClient();
    l_UdpClient.Connect(senderIP); 
    for (int i = 0; i < 20; i++)
    
l_UdpClient.Send(Encoding.ASCII.GetBytes("Hello_UDP_1"), Encoding.ASCII.GetBytes("Hello_UDP_1").Length);
 System.Threading.Thread.Sleep(1000);
    

Sau đây đoạn mã tạo một vòng lặp. Mỗi lần lặp của khối lặp và lắng nghe trên cổng 8758 đến khi nó nhận một gói tin từ bất kỳ địa chỉ IP nào.

IPEndPoint listenerIP = new IPEndPoint(IPAddress.Any, 8758);
 UdpClient listener = new UdpClient(listenerIP); 
    for (int i = 0; i < Convert.ToInt16(this.txtMaxPackets.Text); i++)
    {
     // Now receive the three datagrams from the listener
    IPEndPoint receivedIPInfo = new IPEndPoint(IPAddress.Any, 0); 
    byte[] data = listener.Receive(ref receivedIPInfo); 
    this.textBox1.Text += ("GOT: " +
Encoding.ASCII.GetString(data, 0,
    data.Length) + "FROM: " + receivedIPInfo.ToString());
    }

UDPClient
có thể dễ dàng cấu hình để broadcast tới nhiều địa chỉ IP hoặc tới gói nhận từ nhiều multicast địa chỉ IP. Từ một multicast địa chỉ IP được thao tác bằng một máy chủ, cái này duy trì một danh sách multicast subscribers. Khi một gói được gửi tới một multicast IP address, máy chủ gửi một bản sao của gói tin tới địa chỉ IP của nhiều máy khách, máy đã được tán thành.

Gửi gói Multicast

Để gửi gói UDP tới nhiều một multicast địa chỉ IP, không cần chỉ rõ hành động được yêu cầu. Đơn giản là gửi gói tin như trong ví dụ “Viết mã cho UDP client”.

Nhận gói Multicast

Để nhận gói multicast, trước tiên chúng ta phải đồng ý cùng máy chủ, máy chủ được thao tác multicast địa chỉ IP. Chúng ta có đồng ý để multicast địa chỉ IP, chúng ta có thể lắng nghe gói tin từ multicast địa chỉ IP trong cách như là cho bất kỳ địa chỉ khác. Khi một ai đó gửi một gói tới multicast địa chỉ IP, máy chủ trả lại tới tất cả mọi người trên danh sách đồng ý. Để đồng ý một multicast địa chỉ IP, làm theo các bước sau:

c 1: Tạo một

IPAddress
, đây là một điểm để multicast địa chỉ IP.

c 2: Gọi

UdpClient.JoinMultiCastGroup()

Cố gắng nhận thông tin từ multicast địa chỉ IP sẽ nhận gói tin trở lại từ multicast máy chủ. Đây là thành phần nạp chồng

JoinMultiCastGroup
hỗ trợ trên .NET Compact Framework:

-

JoinMultiCastGroup(IPAddress multicastAddr)
Kết nối một nhóm multicast ở
multicastAddr
.

-

JoinMultiCastGroup(IPAddress multicastAddr, int maxHops)
Kết nối một nhóm multicast tại
multicastAddr
nhưng chỉ nhận gói mà được tao ra bởi
maxHops
.

Ví dụ:

IPAddress l_multicastAddress = new IPAddress("172.68.0.22");
    // Only receive multicast packets that have traveled
    // for 40 or less hops l_UDPClient.JoinMulticastGroup(l_multicastAddress, 40);
    

Để không tán thành từ một multicast địa chỉ IP, gọi

UDPClient.DropMulticastGroup() 
như sau:
l_UDPClient.DropMulticastGroup(l_multicastAddress);
    

Chúng ta hãy thảo luận làm thế nào làm việc với socket để truyền dữ liệu giữa máy khách và máy chủ bằng cách sử dụng gói TCP hoặc UDP. Trong mỗi trường hợp chúng ta đã đưa ra giao thức truyền thông. Ví dụ, ứng dụng quản lý chat được sử dụng một giao thức, đối tượng ChatPacket được tạo ra thành các byte và gửi thông qua kết nối mạng. Trong ví dụ Remote Hello và UDPHello gửi một chuỗi qua lại.

Có rất nhiều máy chủ trên Internet, các máy chủ này có rất nhiều giao thức truyền thông, HTTP, các giao thức này được sử dụng trên WWW. Khi sử dụng giao thức HTTP, có rất nhiều qui tắc để làm thế nào máy khách liên lạc với máy chủ và làm thế nào để máy khách có thể đòi hỏi bất kỳ lúc nào. Dữ liệu mà máy chủ HTTP trả về cho đến khi một thiết lập gói tin TCP, nhưng sự can thiệp thông qua tất cả thông tin liên kết giao thức là một công việc hết sức buồn tẻ. Một giao dịch cùng với máy chủ HTTP có cấu trúc như sau:

c 1: Máy khách kết nối với máy chủ HTTP.

c 2: Máy chủ HTTP trả lời.

c3: Máy khách yêu cầu dữ liệu bằng cách sử dụng GET hoặc yêu cầu vị trí dữ liệu bằng cách sử dụng lệnh POST.

c4: Máy chủ trả về thông tin yêu cầu và dễ dàng đưa ra mã lỗi nếu yêu cầu của máy khách không thể thoả mãn. Ví dụ, mã lỗi phổ biến là 404 được trả về nếu máy khách cố gắng GET một file không tồn tại.

c 5: Bước 4 có số lần lặp tuỳ ý.

c 6: Máy khách đóng kết nối.

Mỗi lần máy khách tạo yêu cầu hoặc máy chủ trả lời, một kết nối socket mới kết nối với máy chủ được tạo. Lớp

HttpWebRequest
được tổ chức tất cả quá trình xử lý phức tạp cùng với quá trình tác động đến máy chủ HTTP.
HttpWebRequest
có thể thao tác những thao tác sau:

 Khởi tạo một kết nối với máy chủ HTTP

 Nhận kết quả trả về từ máy chủ HTTP

 Trả về một dòng lưu trữ dữ liệu được máy chủ HTTP gửi trả về như là kết quả chúng ta yêu cầu.

Sử dụng

HttpWebRequest

Để sử dụng lớp

HttpWebRequest
để download thông tin từ máy chủ HTTP, làm theo các bước sau:

c 1: Tạo một thể hiện của lớp

Uri
để chỉ địa chỉ (URL) của máy chủ

c 2: Cài đặt một

HttpWebRequest 
bằng cách sử dụng
 Uri
của bước 1.

c 3: Yêu cầu

HttpWebRequest
trả về kết quả từ Web Server trong mẫu của lớp
Stream
.

c 4: Dùng nội dung của

Stream.

Đoạn mã ví dụ về

HttpWebRequest

Lớp

HttpWebRequest
làm giảm công việc phức tạp khi giao tiếp với máy chủ thông qua HTTP trong bốn bước trên.
Uri l_Uri = new Uri("http://www.myserver.com"); 
HttpWebRequest l_WebReq = (HttpWebRequest)WebRequest.Create(l_Uri);
HttpWebResponse l_WebResponse =(HttpWebResponse)l_WebReq.GetResponse(); 
Stream l_responseStream = l_WebResponse.GetResponseStream();
StreamReader l_SReader = new StreamReader(l_responseStream); 
// Do something with l_SReader. For example, if you downloaded a
// Web page, you could
// extract the HTML code that came in the response and paint it on
// the screen.
    

Giao thức HTTPS cho phép giải quyết đảm bảo xuất hiện tại Web sites. .NET Compact Framework bổ sung thêm

HttpWebRequest
có khả năng truy cập máy chủ bằng giao thức HTTPS.

Rất nhiều Pocket PC và các thiết bị Windows CE khác có sẵn cổng hồng ngoại (IrDA).

.NET Compact Framework bao gồm các lớp để lập trình dựa vào cổng IrDA.

Truyền thông IrDA giữa hai máy tính, một máy khách (client) và một máy chủ (server). Máy chủ thường kết nối tới máy khách trong vùng của cổng hồng ngoại. Kết nối máy chủ thường được xác định bởi tên máy chủ và ID thiết bị.

Máy khách có thể trong vùng của rất nhiều máy đề nghị kết nối IrDA. Mỗi thiết bị trong vùng có thể giao tiếp có một ID và tên duy nhất. Liệt kê các máy khách thông qua các kết nối sẵn sàng, chọn một, và giao giao tiếp cùng với yêu cầu của máy tính ở xa. Giao tiếp qua cổng hồng ngoại tìm thấy cùng với thông qua các sự kiện:

c1: Một thiết bị cung cấp một hoặc nhiều dịch vụ tới các máy khác trong vùng cổng IrDA của nó. Thiết bị được xác định thông qua tên và ID của thiết bị. Địch vụ cung cấp được xác định thông qua tên.

c2: Một thiết bị khách muốn mở một danh sách liệt kết nối thông qua tất cả các thiết bị trong vùng của thiết bị khách.

c3: Một lựa chọn máy khách của các thiết bị sẵn sàng và kết nối tới một một dịch vụ của được cung cấp bởi thiết bị đã chọn.

Sử dụng

IrDAClient
để truy cập cổng IrDA

Đối tượng trung tâm cho kết nối IrDA trên .NET Compact Framework là

IrDAClient
. Cùng với sợ giúp đỡ của nhiều lớp hỗ trợ được thảo luận,
IrDAClient
có thể làm việc như một máy chủ hoặc máy khác.
IrDAClient
có thể được sử dụng tìm kiếm các kết nối sẵn sàng hoặc các kết nối được cung cấp trên các thiết bị khác.

IrDAClient 
và các lớp liên quan IrDA tập trung trong thư viện có tên là
System.Net.IrDA.dll
. Chúng ta phải thêm một tham chiếu để sử dụng thư viện này trong dự án trước khi có thể sử dụng. Để thêm thư viện, vào menu Project-> Add References. Trong hộp thoại, bấm đúp chuột vào nhãn có tên
System.Net.IrDA
và bấm OK.

Một kết nối được tạo ra cùng với một nhóm ở xa,

 IrDAClient
cung cấp phương thức
GetStream(),
phương thức này đưa ra một thể hiện Stream cùng với chương trình có thể đọc và ghi dữ liệu.

Kết nối t ới cổng IrDA như một máy khách

Khi kết nối như một IrDA khách, nó bị lạm dung như là người phát triển, chúng ta biết tên của thiết bị cùng với cái mà chúng ta muốn kết nối. Chương trình phải lặp thông qua tất cả các thiết bị sẵn sàng và chọn một cái cùng với dịch vụ yêu cầu. Chúng ta làm theo các bước sau:

c 1: Tạo một kết nối

IrDAClient
.

c 2: Nhận danh sách các thiết bị sẵn sàng kết nối bằng cách gọi

IrDAClient.DiscoverDevices
. Phương thức
DiscoverDevices
trả về một mảng các đối tượng
IrDADeviceInfo
.

c3: Duyệt mỗi

IrDADeviceInfo
trong mảng để tìm ra các thiết bị sẵn sàng được ứng dụng sẽ kết nối.

c4: Nếu yêu cẩu của thiết bị được tìm thấy, sau đó kết nối tới bằng cách gọi phương thức

IrDAClient.Connect().
Thông qua tên của dịch vụ để kết nối tới.

c 5: Sử dụng

IrDAClient
để kết nối. Ví dụ:

Đoạn mã sau nhận được từ ứng dụng ví dụ. Đoạn mã liệt kê tất cả thiết bị sẵn sàng và cố gắng kết nối tới một thiết bị được cung cấp bởi một dịch vụ có tên là IRDA_CHAT_SERVER. Nó là một kết nối có một chat server ở xa đợi một ai đó kết nối và chat.

m_IrDAClient = new IrDAClient();
bool l_foundAnyDevice = false;
int MAX_DEVICES = 5; 
// Find out who's out there to connect with... IrDADeviceInfo[] l_DevsAvailable =
m_IrDAClient.DiscoverDevices(MAX_DEVICES); 
// Show a MessageBox telling user every device we see out there 
foreach (IrDADeviceInfo l_devInfo in l_DevsAvailable)
   {
     l_foundAnyDevice = true;
     MessageBox.Show(l_devInfo.DeviceName, "Discovered IrDA device"); 
    // Now try to connect to the devices, hoping it offers a service
    // named "IRDA_CHAT_SERVER" 
try
{

}
// Assume that first device is offering a service that we
// want
IrDAEndPoint chatEndPoint = new IrDAEndPoint(
l_DevsAvailable[0].DeviceID, "IRDA_CHAT_SERVER");
m_IrDAClient.Connect(chatEndPoint); 
MessageBox.Show("Connected to chat server!", "Ready to chat");
m_Connected = true;
break;
}
catch (SocketException exc)
{}
}
// m_IrdaClient can now be read from or written to.

Th i ết lập m ột k ế t nối IrDA n h ư một máy c h

Để thiết lập kết nối IrDA như là một thiết bị, làm theo các bước sau:

c 1: tạo một thể hiện của

IrDAListener
, thông qua tên của thiết bị trong cấu trúc.

c 2: Gọi phương thức

Start()
trên
IrDAListener
.

c3: Gọi phương thức

IrDAListener.AcceptIrDAClient()
để nhận một thể hiện của
IrDAClient
khi một ai đó kết nối.

c 4: Sử dụng

IrDAClient
để giao tiếp với các thiết bị tham gia giao tiếp.

Th i ết lập k ế t nối như m ột thi ế t bị ch ủ, ví dụ:

Đây là đoạn mã lệnh ví dụ lấy từ ứng dụng ví dụ IrDAChat. Nó demo làm thế nào để sử dụng một

IrDAListener
để cung cấp một kết nối gọi IRDA_CHAT_SERVER từ các thiết bị khác và đợi một ai đó kết nối.
IrDAListener l_IrDAListener = new IrDAListener("IRDA_CHAT_SERVER"); 
    // Listen for anyone who wants to connect l_IrDAListener.Start(); 
    // And now pull the first queued connection request out as an
    // IrDAClient
    m_IrDAClient = l_IrDAListener.AcceptIrDAClient(); 
    MessageBox.Show("Accepted a connection", "Ready to chat");
    

Đ ọc dữ l i ệu t ừ một

IrDAClient

Một

IrDAClient 
được kết nối với các thiết bị ở xa cùng tham gia giao tiếp, khả năng đọc dữ liệu đạt được theo cách như nhau dù kết nối chủ hay khách, như sau:

c 1: Tạo một

StreamReader
thông qua
Stream
đã liên kết cùng với
IrDAClient 
trong cấu trúc
StreamReader
.

c 2: Đọc dữ liệu từ

StreamReader
.

Đ ọc dữ l i ệu t

 IrDAClient
: đoạn mã ví dụ:
l_StreamReader = new StreamReader(this.m_IrDAClient.GetStream(), System.Text.Encoding.ASCII);
// Read a line of text and paint it into a GUI this.lbInText.Items.Add(l_StreamReader.ReadLine());
l_StreamReader.Close();
    

Ghi d ữ l i ệu vào

IrDAClient

Once an

IrDAClient
is connected to a remote party, writing data is achieved the same way whether connected as a server or as a client, as follows:

c1: Tạo

StreamWriter
thông qua
Stream
liên kết cùng
IrDAClient
trong cấu trúc
StreamWriter
.

c 2: Ghi dữ liệu vào

StreamWriter
.

Ghi d ữ l i ệu vào

 IrDAClient
: đoạn mã ví dụ:

Sau đây là đoạn mã ví dụ lấy từ ứng dụng ví dụ IrDAChat. Đoạn mã viết một dòng văn bản, cái đó yêu lấy được từ giao diện người sử dụng, để luồng đạt được từ

IrDAClient
.
// Grab a reference to the stream in the m_IrDAClient and send the
    // text to it.
    StreamWriter l_StreamWriter = new
    StreamWriter(this.m_IrDAClient.GetStream(), System.Text.Encoding.ASCII);
    l_StreamWriter.WriteLine(this.txtSendText.Text);
    l_StreamWriter.Close();
    
0