Sử dụng C# Stream với TCP Socket( Phần 2)

0
1430

Như đã đề cập ở bài viết trước điều khiển thông điệp dùng giao thức TCP thường gây ra khó khăn cho các lập trình viên nên .NET Framework cung cấp một số lớp để giảm gánh nặng lập trình. Một trong những lớp đó là NetworkStream, và hôm nay chúng ta sẽ tiếp tục hai lớp  TCP là StreamWriter và StreamReader

Namespcace System.IO chứa hai lớp StreamReader và StreamWriter điều khiển việc đọc và ghi các thông điệp text từ mạng. Cả hai lớp đều có thể được triển khai với một đối tượng NetworkStream để xác định các hệ thống đánh dấu cho các thông điệp TCP.

Lớp StreamReader có nhiều phương thức tạo lập, trong đó phương thức tạo lập đơn giản nhất của lớp StreamReader:

public StreamReader(Stream stream);

Biến stream có thể được tham chiếu đến bất kỳ kiểu đối tượng Stream nào kể cả đối tượng NetworkStream. Có nhiều phương thức và thuộc tính có thể được dùng với đối tượng StreamReader sau khi nó được ra như: Close(), CreateObjRef(), DiscardBufferedData(), Equals(), GetHashCode(), GetLifetimeService()….

Tương tự đối tượng StreamReader, đối tượng StreamWriter có thể được tạo ra từ một đối tượng NetworkStream:

public StreamWriter (Stream stream);

StreamWriter cũng có nhiều phương thức và thuộc tính kết hợp với nó, một số phương  thức  và  thuộc  tính  của  lớp  StreamReader  cũng  có  trong   đối  tượng StreamWriter, ngoài ra nó còn có một số phương thức và thuộc tính riêng như: Flush(), Write(), WriteLine().

Phương thức ReadLine() là phương thức hay nhất của lớp StreamReader. Nó đọc các ký tự từ stream cho tới khi nó gặp ký tự xuống dòng. Tính năng này cho phép sử dụng ký tự xuống dòng như là một ký tự phân tách các thông điệp. Phương thức WriteLine() của lớp StreamWriter sẽ so khớp với phương thức ReadLine của lớp StreamReader do đó việc xử lý các thông điệp TCP trở nên dễ dàng hơn.

Ví dụ về chương trình CLient- Server đơn giản sử dụng C# Stream 

Chương trình Stream TCP Server

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
class StreamTcpSrvr
{
    public static void Main()
    {
        string data;
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);
        Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        newsock.Bind(ipep);
        newsock.Listen(10);
        Console.WriteLine("Dang cho Client ket noi toi...");
        Socket client = newsock.Accept();
        IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
        Console.WriteLine("Da ket noi voi Client {0} tai port {1}", newclient.Address, newclient.Port);
        NetworkStream ns = new NetworkStream(client);
        StreamReader sr = new StreamReader(ns);
        StreamWriter sw = new StreamWriter(ns);
        string welcome = "Hello Client";
        sw.WriteLine(welcome);
        sw.Flush();
        while (true)
        {
            try
            {
                data = sr.ReadLine();
            }
            catch (IOException)
            {
            }
            break;
            Console.WriteLine(data);
            sw.WriteLine(data);
            sw.Flush();
        }
        Console.WriteLine("Da dong ket noi voi Client {0}", newclient.Address);
        sw.Close();
        sr.Close();
        ns.Close();
    }
}

Chương trình Stream TCP Client 

using System; using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
class StreamTcpClient
{
    public static void Main()
    {
        string data;
        string input;
        IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);
        Socket server = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);
        try
        {
            server.Connect(ipep);
        }
        catch (SocketException e)
        {
            Console.WriteLine("Khong the ket noi den server");
            Console.WriteLine(e.ToString());
            return;
        }
        NetworkStream ns = new NetworkStream(server);
        StreamReader sr = new StreamReader(ns);
        StreamWriter sw = new StreamWriter(ns);
        data = sr.ReadLine();
        Console.WriteLine(data); while (true)
        {
            input = Console.ReadLine();
            if (input == "exit")
                break;
            sw.WriteLine(input);
            sw.Flush();
            data = sr.ReadLine(); Console.WriteLine(data);
        }
        Console.WriteLine("Dang dong ket noi voi server...");
        sr.Close();
        sw.Close();
        ns.Close();
        server.Shutdown(SocketShutdown.Both);
        server.Close();
    }
}

Đến đây xem như đã giới thiệu và giải quyết hầu hết các vấn đề của lập trình TCP Client Server. Ở các bài viết tiếp theo sẽ giới thiệu đến các bạn Lập trình Socket phi kết nối  hay còn gọi là UDP. Hẹn gặp lại các bạn, chúc các bạn thành công.

This site uses Akismet to reduce spam. Learn how your comment data is processed.