Lập trình mạng: Xây dựng ứng dụng client – server hướng kết nối (TCP Socket)

2
6401

Sau khi học xong phần lý thuyết chương 2. Chúng ta sẽ tiến hành xây dựng ứng dụng Client – Server dạng hướng kết nối (TCP Socket)

Các bước chính

  • Mô hình ứng dụng
  • Các thao tác phía server
  • Các thao tác phía client
  • Quá trình truyền nhận dữ liệu
  • Đóng kết nối

Mô hình ứng dụng

13816804_10202038598203019_1108203146_n

Các thao tác phía server

– Tạo ra một Sockets

 IPEndPoint ipep = new IPEndPoint(IPAddress.Any,9050);
 Socket newsock = new     Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

– Gắn Sockets đó với một địa chỉ cụ thể (binding)

newsock.Bind(ipep);

– Lắng nghe kết nối tới

Sau khi socket đã được gắn với một địa chỉ cụ thể, sử dụng phương thức Listen() để đặt socket ở trạng thái lắng nghe kết nối từ Client tới.

newsock.Listen(10);

– Chấp nhận kết nối

Sau khi gọi phương thức Listen(), Socket của ta đã sẵn sàng chấp nhận kết nối từ Client.

Gọi hàm Accept() để chấp nhận các kết nối từ Client.

Hàm Accept() sẽ trả lại một đối tượng socket mới được sử dụng cho quá trình truyền và nhận dữ liệu sau này.

Socket client = newsock.Accept();

Các thao tác phía client 

– Tạo ra một Sockets

Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

Bạn có thể thay tên server thành client để dễ nhận biết.

– Kết nối đến Server

server.Connect(ipep);

Quá trình truyền và nhận dữ liệu

Sau khi Client kết nối đến Server và đã được chấp nhận, Client và Server có thể bắt đầu quá trình truyền và nhận dữ liệu

Sử dụng hàm Send() và Receive() để thực hiện các công việc này.

Đóng kết nối

Sau khi quá trình truyền và nhận dữ liệu kết thúc, Socket cần phải được đóng lại.

Ta có thể sử dụng hàm Shutdown() để tạm dùng phiên làm việc và dùng hàm Close() để đóng phiên làm việc đó.

Trên đây là các bước để tạo ra một server là client đơn giản để giao tiếp. Để làm rõ hơn chúng ta sẽ đi đến một ví dụ là khi server và client kết nối được với nhau thì client sẽ gửi một thông điệp và server sẽ phản hồi lại thông điệp đó. Ở đây sẽ lấy ví dụ là client sẽ nhập tên người sử dụng và phía server sẽ gửi lại thông điệp là chào lại người sử dụng đúng với tên người sử dụng đã nhập..

Code phía server

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

public class Y2Server
{

    private const int BUFFER_SIZE = 1024;
    private const int PORT_NUMBER = 9999;

    static ASCIIEncoding encoding = new ASCIIEncoding();

    public static void Main()
    {
        Console.OutputEncoding = Encoding.UTF8;
        try
        {
            IPAddress address = IPAddress.Parse("127.0.0.1");

            TcpListener listener = new TcpListener(address, PORT_NUMBER);

            // 1. listen
            listener.Start();

            Console.WriteLine("Server bắt đầu kết nối tới IEP là:  " + listener.LocalEndpoint);
            Console.WriteLine("Đang chờ kết nối ...");

            Socket socket = listener.AcceptSocket();
            Console.WriteLine("Kết nối nhận được từ " + socket.RemoteEndPoint);

            // 2. receive
            byte[] data = new byte[BUFFER_SIZE];
            socket.Receive(data);

            string str = encoding.GetString(data);

            // 3. send
            socket.Send(encoding.GetBytes("Xin Chao " + str));

            // 4. close
            socket.Close();
            listener.Stop();

        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex);
        }
        Console.Read();
    }
}

Code phía client

using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
using System;
public class Y2Client
{

    private const int BUFFER_SIZE = 1024;
    private const int PORT_NUMBER = 9999;

    static ASCIIEncoding encoding = new ASCIIEncoding();

    public static void Main()
    {

        Console.OutputEncoding = Encoding.UTF8;
        try
        {
            TcpClient client = new TcpClient();

            // 1. connect
            client.Connect("127.0.0.1", PORT_NUMBER);
            Stream stream = client.GetStream();

            Console.WriteLine("Kết nối tới server");
            Console.Write("Mời bạn nhập Họ và Tên của bạn : ");

            string str = Console.ReadLine();

            // 2. send
            byte[] data = encoding.GetBytes(str);

            stream.Write(data, 0, data.Length);

            // 3. receive
            data = new byte[BUFFER_SIZE];
            stream.Read(data, 0, BUFFER_SIZE);

            Console.WriteLine(encoding.GetString(data));

            // 4. Close
            stream.Close();
            client.Close();
        }

        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex);
        }

        Console.Read();
    }
}

Kết quả:

1

2

3

5

Bài viết trên đây nhằm giới thiệu đến các bạn các bước cơ bản để tạo ra một server và một client để có thể giao tiếp một cách đơn giản nhất. Hẹn gặp lại các bạn ở các bài viết sau. Chúc các bạn thành công.

2 COMMENTS

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