Networks Business Online Việt Nam & International VH2

C# – Lập trình Socket giao tiếp TCP client/server

Đăng ngày 07 November, 2022 bởi admin

Trong lập trình, Socket là một API (Application Programming Interface) cung cấp các phương thức để giao tiếp thông qua mạng. Trước khi bắt đầu tìm hiểu và viết một ví dụ đơn giản về socket, bạn có thể tham khảo bài  viết “Networking – Một số khái niệm cơ bản“ để có cái nhìn sơ lược về những khái niệm cơ bản trong lập trình mạng.

Các lớp. Net cơ bản trong lập trình mạng

Các lớp này được phân phối trong hai namespace System. Net và System. Net. Sockets. Hai namespace này chứa rất nhiều lớp dùng trong lập trình mạng, nhưng trong khoanh vùng phạm vi bài viết ta chỉ chăm sóc đến những lớp sau ::

Class Namespace Desciption
IPAddress System.Net Provides an Internet Protocol (IP) address.
IPEndPoint System.Net Represents a network endpoint as an IP address and a port number.
TcpListener System.Net.Sockets Listens for connections from TCP network clients.
Socket System.Net.Sockets Implements the Berkeley sockets interface.
TcpClient System.Net.Sockets Provides client connections for TCP network services.
NetworkStream System.Net.Sockets Provides the underlying stream of data for network access.

Kết nối Server-Client với TCP / IP

Khi được chạy, server cần được xác định rõ địa chỉ IP và sẽ “lắng nghe” trên một port cụ thể. Server sẽ nằm trong trạng thái này cho đến khi client gửi đến một yêu cầu kết nối. Sau khi được server chấp nhận, một connection sẽ hình thành cho phép server và client giao tiếp với nhau.

Cụ thể hơn, những bước triển khai trên server và client mà ta cần triển khai sử dụng giao thức TCP / IP trong C # ( hoàn toàn có thể chạy server và client trên cùng một máy ) :

Server:

  1. Tạo một đối tượng System.Net.Sockets.TcpListener để bắt đầu “lắng nghe” trên một cổng cục bộ.
  2. Đợi và chấp nhận kết nối từ client với phương thức AccepSocket(). Phương thức này trả về một đối tượng System.Net.Sockets.Socket dùng để gửi và nhận dữ liệu.
  3. Thực hiện giao tiếp với client.
  4. Đóng Socket.

Thông thường quá trình này sẽ được đặt trong một vòng lặp ( lặp lại bước 2 ) để đồng ý nhiều liên kết cùng lúc ( sử dụng Thread ) hoặc những liên kết lần lượt .

Client:

  1. Tạo một đối tượng System.Net.Sockets.TcpClient
  2. Kết nối đến server với địa chỉ và port xác định với phương thức TcpClient.Connect()
  3. Lấy luồng (stream) giao tiếp bằng phương thức TcpClient.GetStream().
  4. Thực hiện giao tiếp với server.
  5. Đóng luồng và socket.

Quy trình này hoàn toàn có thể được minh họa theo quy mô sau :

Example v1 : Gửi nhận tài liệu dạng byte [ ]

Lớp NetworkStream và Socket cung ứng những phương pháp gửi và nhận tài liệu dạng mảng byte. Vì vậy bạn cần phải thực thi những bước quy đổi tài liệu sang dạng byte và ngược lại. Trong ví dụ sau tôi sử dụng tài liệu dạng văn bản ASCII trong console, và dùng những lớp trong namespace System. Text để quy đổi. Có hai cách bạn hoàn toàn có thể vận dụng :
– Dùng những static property của lớp abstract System. Text. Encoding với những phương pháp GetString ( ) và GetBytes ( ) .
– Tạo đối tượng người tiêu dùng có kiểu XXXEncoding ( thừa kế từ System. Text. Encoding ). Ví dụ : UTF8Encoding, ASCIIEncoding, …
Một ví dụ gửi nhận tài liệu đơn thuần nhất sử dụng TCPListener, Socket ( phía server ) và TCPClient, NetworkStream ( phía client ) dạng mảng byte với địa chỉ loop-back 127.0.0.1 trên cùng một máy .
Tạo hai dự án Bất Động Sản console là Y2Server và Y2Client với nội dung sau :

Y2Server.cs (v1):

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() {
        try {
            IPAddress address = IPAddress.Parse("127.0.0.1");

            TcpListener listener=new TcpListener(address,PORT_NUMBER);

            // 1. listen
            listener.Start();

            Console.WriteLine("Server started on "+listener.LocalEndpoint);
            Console.WriteLine("Waiting for a connection...");

            Socket socket=listener.AcceptSocket();
            Console.WriteLine("Connection received from " + socket.RemoteEndPoint);

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

            string str=encoding.GetString(data);

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

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

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

Y2Client.cs (v1):

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

public class Y2Client{

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

    static ASCIIEncoding encoding= new ASCIIEncoding();

    public static void Main() {

        try {
            TcpClient client = new TcpClient();

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

            Console.WriteLine("Connected to Y2Server.");
            Console.Write("Enter your name: ");

            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();
    }
}

Để kiểm tra ví dụ, bạn chạy server trước, hành lang cửa số console của server sẽ hiển thị :

Server started on 127.0.0.1 : 9999
Waiting for a connection …

Tiếp đến cho chạy client, nếu liên kết thành công xuất sắc, server sẽ hiển thị thêm dòng thông tin tựa như như sau :

Connection received from 127.0.0.1 : 2578

Chuyển qua hành lang cửa số console của client và nhập tên của bạn vào, nếu nhận được tài liệu, server sẽ gửi trả lại dòng thông điệp “ Hello [ Your Name ] ”

Connected to Y2Server .

Enter your name: Yin Yang

Hello Yin Yang

Ngay sau bước này, cả server và client đều thực thi đóng liên kết .

Example v2 : Sử dụng StreamReader và StreamWriter

Sẽ thuận tiện hơn nếu ta sử dụng StreamReader và StreamWriter để gửi nhận tài liệu mà không cần bước quy đổi qua lại mảng byte. Các đối tượng người tiêu dùng StreamReader và StreamWriter hoàn toàn có thể được khởi tạo trực tiếp từ NetworkStream. Thuộc tính AutoFlush của StreamWriter thường được đặt là true để tự động hóa gửi tài liệu mà không cần đợi bộ đệm đầy hoặc bạn phải gọi thủ công bằng tay phương pháp Flush ( ) .
Ví dụ sau sử dụng vòng lặp để thực thi gửi nhận tài liệu liên tục giữa server / client cho đến khi client nhập vào chuỗi “ exit ” :

 Y2Server.cs (v2):

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

public class Y2Server {

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

    static ASCIIEncoding encoding=new ASCIIEncoding();

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

            TcpListener listener=new TcpListener(address,PORT_NUMBER);

            // 1. listen
            listener.Start();

            Console.WriteLine("Server started on "+listener.LocalEndpoint);
            Console.WriteLine("Waiting for a connection...");

            Socket socket=listener.AcceptSocket();
            Console.WriteLine("Connection received from " + socket.RemoteEndPoint);

            var stream = new NetworkStream(socket);
            var reader=new StreamReader(stream);
            var writer=new StreamWriter(stream);
            writer.AutoFlush=true;

            while(true)
            {
                // 2. receive
                string str=reader.ReadLine();
                if(str.ToUpper()=="EXIT")
                {
                    writer.WriteLine("bye");
                    break;
                }
                // 3. send
                writer.WriteLine("Hello "+str);
            }
            // 4. close
            stream.Close();
            socket.Close();
            listener.Stop();
        }
        catch (Exception ex) {
            Console.WriteLine("Error: " + ex);
        }
        Console.Read();
    }
}

Y2Client.cs (v2):

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

public class Y2Client{

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

    static ASCIIEncoding encoding= new ASCIIEncoding();

    public static void Main() {

        try {
            TcpClient client = new TcpClient();

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

            Console.WriteLine("Connected to Y2Server.");
            while(true)
            {
                Console.Write("Enter your name: ");

                string str = Console.ReadLine();
                var reader=new StreamReader(stream);
                var writer=new StreamWriter(stream);
                writer.AutoFlush=true;

                // 2. send
                writer.WriteLine(str);

                // 3. receive
                str=reader.ReadLine();
                Console.WriteLine(str);
                if(str.ToUpper()=="BYE")
                    break;
            }
            // 4. close
            stream.Close();
            client.Close();
        }

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

        Console.Read();
    }
}

Bạn chạy ví dụ này giống như ví dụ tiên phong và gõ ‘ exit ’ vào client để thoát ứng dụng .

Cập nhật: (27/9/2010)

Thay đổi BUFFER_SIZE từ 100 lên 1024. ( cảm ơn bạn hoang )
https://vh2.com.vn

Đánh giá:

Share this:

Thích bài này:

Thích

Đang tải …

Source: https://vh2.com.vn
Category : Tin Học