Trong các bài viết trước, đa số các chương trình đơn giản đã giới thiệu đến các bạn khá phức tạp và khó hiểu với người mới bắt đầu lập trình mạng. Mặc dù đã sử dụng các lớp như C# Stream …. nhưng đa số vẫn còn khá phức tạp. Trong bài viết này sẽ giới thiệu đến các bạn các lớp Helper của C# Socket. Vậy nó giúp ích thế nào cũng như có các bất cập nào trong khi sử dụng thì hôm nay chúng ta sẽ tìm hiểu về các lớp Helper của C# Socket.
Đầu tiên chúng ta sẽ đến với lớp TCP Client
Lớp TcpClient nằm ở namespace System.Net.Sockets được thiết kế để hỗ trợ cho việc viết các ứng dụng TCP Client được dễ dàng.
Lớp TcpClient cho phép tạo ra một đối tượng Tcp Client sử dụng một trong ba phương thức tạo lập sau:
TcpClient(): là phương thức tạo lập đầu tiên, đối tượng được tạo ra bởi phương thức tạo lập này sẽ gắn kết với một địa chỉ cục bộ và một port TCP ngẫu nhiên. Sau khi đối tượng TcpClient được tạo ra, nó phải được kết nối đến thiết bị ở xa thông qua phương thức Connect().
TcpClient(IPEndPoint localEP): phương thức tạo lập này cho phép chúng ta chỉ ra địa chỉ IP cục bộ cùng với port được dùng. Đây là phương thức tạo lập thường được sử dụng khi thiết bị có nhiều hơn một card mạng và chúng ta muốn dữ liệu được gởi trên card mạng nào. Phương thức Connect() cũng được dùng để kết nối với thiết bị ở xa.
TcpClient(String host, int port): phương thức tạo lập thứ ba này thường được sử dụng nhất, nó cho phép chỉ ra thiết bị nhận trong phương thức tạo lập và không cần phải dùng phương thức Connect(). Địa chỉ của thiết bị ở xa có thể là một chuỗi hostname hoặc một chuỗi địa chỉ IP. Phương thức tạo lập của TcpClient sẽ tự động phân giải hostname thành địa chỉ IP.
Code:
TcpClient():
TcpClient newcon = new TcpClient(); newcon.Connect("192.168.6.1", 8000);
TcpClient((IPEndPoint localEP):
IPEndPoint iep = new IPEndPoint(IPAddress,Parse("192.168.6.1"),8000); TcpClient newcon = new TcpClient(iep); newcon.Connect("192.168.6.2", 8000);
TcpClient(String host, int port):
TcpClient newcon = new TcpClient("www.isp.net", 8000);
Chương trình TCPClient đơn giản
using System; using System.Net; using System.Net.Sockets; using System.Text; class TcpClientSample { public static void Main() { byte[] data = new byte[1024]; string input, stringData; TcpClient server; try { server = new TcpClient("127.0.0.1", 5000); } catch (SocketException) { } Console.WriteLine("Khong the ket noi den server"); return; NetworkStream ns = server.GetStream(); int recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); while (true) { input = Console.ReadLine(); if (input == "exit") break; ns.Write(Encoding.ASCII.GetBytes(input), 0, input.Length); ns.Flush(); data = new byte[1024]; recv = ns.Read(data, 0, data.Length); stringData = Encoding.ASCII.GetString(data, 0, recv); Console.WriteLine(stringData); } Console.WriteLine("Dang ngat ket noi voi server..."); ns.Close(); server.Close(); } }
Trong chương trình trên phương thức tạo lập sẽ tự động kết nối đến Server được chỉ ra ở xa, nó nên được đặt ở trong khối try-catch để phòng trường hợp Server không hợp lệ.
Sau khi đối tượng NetworkStream được tạo ra, ta có thể dùng phương thức Read() và Write() để nhận và gởi dữ liệu.
Cần chú ý rằng TCP không bảo vệ các biên thông điệp. Điều này cũng áp dụng cho lớp TcpClient, do đó ta cần phải xử lý vấn đề biên thông điệp giống như phương thức Receive() của lớp Socket bằng cách tạo ra vòng lặp để đảm bảo tất cả dữ liệu đều được đọc từ stream.
Ta có thể test chương trình này với chương trình TCP Server đơn giản tại đây.
Các bạn có thể dễ dàng nhận thấy rằng khi sử dụng các lớp Helper thì code của các bạn sẽ ngắn và dễ hiểu hơn rất nhiều so với code chúng ta đã viết ở chương trình đơn giản ở các bài viết trước. Trên đây là lớp hỗ trợ dành cho TCP ( hướng kết nối), ở bài viết sau sẽ giới thiệu đến các bạn lớp hỗ trợ của UDP. Hẹn gặp lại các bạn.
CHÚC CÁC BẠN THÀNH CÔNG.