sách gpt4 ăn đã đi

Mã ví dụ về giao tiếp TCP của socket C#

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 27 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN này có các mã ví dụ giao tiếp C# Socket TCP được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.

Giao tiếp TCP ổ cắm.

1. Nguyên tắc giao tiếp ổ cắm.

Các bước ở phía máy chủ như sau.

(1) Thiết lập Ổ cắm phía máy chủ và bắt đầu lắng nghe các yêu cầu kết nối trong toàn bộ mạng.

(2) Khi phát hiện yêu cầu kết nối từ máy khách, thông tin về việc nhận yêu cầu kết nối sẽ được gửi đến máy khách và kết nối được thiết lập với máy khách.

(3) Khi quá trình giao tiếp hoàn tất, máy chủ sẽ đóng kết nối Ổ cắm với máy khách.

Các bước dành cho khách hàng như sau.

(1) Thiết lập Ổ cắm của máy khách và xác định tên máy chủ và cổng của máy chủ sẽ được kết nối.

(2) Gửi yêu cầu kết nối tới máy chủ và chờ phản hồi từ máy chủ.

(3) Sau khi kết nối thành công, tương tác với máy chủ để lấy dữ liệu.

(4) Sau khi xử lý xong dữ liệu, hãy đóng kết nối Ổ cắm của chính nó.

2. Phương thức giao tiếp ổ cắm.

Có hai phương thức giao tiếp socket: đồng bộ và không đồng bộ.

Cách đồng bộ hóa hoạt động

Khi lập trình với giao thức TCP, khi chương trình thực hiện các câu lệnh gửi, nhận và giám sát, nó sẽ không tiếp tục thực thi cho đến khi công việc hoàn thành, tức là nó sẽ ở trạng thái chặn. câu lệnh cho đến khi câu lệnh hoàn thành một công việc nhất định.

Chế độ làm việc không đồng bộ.

Khi chương trình thực hiện các câu lệnh gửi, nhận và nghe, nó sẽ tiếp tục thực thi bất kể công việc đã hoàn thành hay chưa.

3. Triển khai socket trong C#.

1.1. Đồng bộ hóa:

Giao tiếp máy chủ-máy khách.

Sau khi kết nối với máy chủ được thiết lập, chúng ta có thể gửi và nhận dữ liệu thông qua kết nối này. Dữ liệu được truyền giữa các cổng dưới dạng luồng Vì hầu hết mọi đối tượng đều có thể được lưu vào luồng nên mọi loại dữ liệu thực sự có thể được truyền giữa máy khách và máy chủ. Đối với máy khách, ghi dữ liệu vào luồng là truyền dữ liệu đến máy chủ; đọc dữ liệu từ luồng là nhận dữ liệu từ máy chủ. Đối với máy chủ, ghi dữ liệu vào luồng là gửi dữ liệu đến máy khách; đọc dữ liệu từ luồng là nhận dữ liệu từ máy khách.

Máy chủ:

(1) Máy chủ lắng nghe trên cổng:

Máy chủ thiết lập một ổ cắm, đặt địa chỉ IP cục bộ và cổng nghe để liên kết với ổ cắm và bắt đầu lắng nghe các yêu cầu kết nối, nó sẽ gửi xác nhận, thiết lập kết nối với máy khách và bắt đầu liên lạc với máy khách. khách hàng.

?
1
2
3
Trình nghe TcpListener = mới TcpListener( mới IPEndPoint(IPAddress.Parse(ip), cổng)); //ip là địa chỉ IP của máy chủ, cổng là cổng nghe
 
Listener.Start(); //Bật nghe

(2) Phát hiện các yêu cầu kết nối từ client.

?
1
2
TcpClient remoteClient = listener.AcceptTcpClient();
// Máy khách nhận thể hiện ý nghĩa của việc đồng bộ hóa. Nếu máy khách bắt đầu kết nối với máy chủ, chương trình sẽ đợi (chặn) tại đây cho đến khi có yêu cầu kết nối từ máy khách.

(3) Thiết lập và kết nối luồng dữ liệu của khách hàng (truyền dữ liệu).

?
1
NetworkStream streamToClient = remoteClient.GetStream();

Miễn là luồng dữ liệu được sử dụng để nhận và gửi dữ liệu, quá trình đồng bộ hóa cũng được chia thành nhiều máy khách và một máy khách. Nếu phân chia chi tiết hơn thì sẽ có một và nhiều phần dữ liệu từ máy khách. các phần dữ liệu từ một máy khách. Nếu vậy, sau khi kết nối máy khách, chỉ cần thêm một vòng lặp trước khi thiết lập luồng dữ liệu. Nếu có nhiều máy khách, chỉ cần thêm một vòng lặp trước (2). Để nhận dữ liệu hiệu quả, máy chủ nên được tạo thành một luồng cho dù đó là đồng bộ hay không đồng bộ. Xem Demo để biết chi tiết.

(4) Nhận dữ liệu do client gửi đến (dùng cache để nhận).

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
byte [] bộ đệm = mới byte [Kích thước bộ đệm]; // BufferSize là kích thước của bộ đệm
 
  số nguyên byteĐọc;
 
  thử
 
  {
 
   khóa (luồng tới khách hàng) //Khóa luồng dữ liệu để đảm bảo tính toàn vẹn và bảo mật dữ liệu
 
    {
 
      bytesRead = streamToClient.Read(bộ đệm, 0, Kích thước bộ đệm);
 
}

(5) Gửi dữ liệu đến máy khách được kết nối.

?
1
2
3
4
5
6
7
khóa (luồng tới khách hàng)
 
            {
 
            streamToClient.Write(bộ đệm, 0, bộ đệm.Độ dài); // bộ đệm là mảng ký tự được gửi        
 
}

 (6) Giải phóng luồng dữ liệu và TcpClient (dành cho dữ liệu tiếp theo và ứng dụng khách gửi và nhận).

?
1
2
3
streamToClient.Dispose(); // Giải phóng dữ liệu trong luồng dữ liệu
 
  remoteClient. Đóng(); // Giải phóng phiên bản TcpClient

khách hàng.

(1) Kết nối với máy chủ.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TcpClient tcp = mới Khách hàng TCP();
 
tcp.Connect(IP,Cổng); // Kết nối dựa trên địa chỉ IP và cổng nghe của máy chủ
 
nếu như (tcp.Đã kết nối)
 
{
 
// Xem DEMO để biết chi tiết về cơ chế thông báo kết nối thành công.
 
ShowGetData( "Kết nối thành công với máy chủ:" , cái này .strIP.Text.ToString());
 
 
  }

Điều cần lưu ý ở đây là dù bạn sử dụng constructor với tham số để kết nối với máy chủ hay thiết lập kết nối với máy chủ thông qua phương thức Connect() thì đó đều là phương thức đồng bộ (hay còn gọi là chặn, trong tiếng Anh gọi là block). Điều đó có nghĩa là máy khách không thể tiếp tục thực hiện các hoạt động tiếp theo cho đến khi kết nối thành công với máy chủ và phương thức trả về hoặc máy chủ không tồn tại và một ngoại lệ được đưa ra. Ngoài ra còn có một phương thức gọi là BeginConnect(), được sử dụng để triển khai các kết nối không đồng bộ, nhờ đó chương trình sẽ không bị chặn và các hoạt động tiếp theo có thể được thực hiện ngay lập tức. Điều này là do kết nối có thể mất nhiều thời gian để hoàn thành do tắc nghẽn mạng. và các vấn đề khác. Có rất nhiều hoạt động không đồng bộ trong lập trình mạng và mọi thứ đều bắt đầu từ đơn giản đến khó. Chúng ta sẽ thảo luận về các hoạt động không đồng bộ sau, nhưng bây giờ chúng ta chỉ xem xét các hoạt động đồng bộ.

(2) Thiết lập luồng dữ liệu để kết nối với máy chủ.

?
1
NetworkStream streamToServer = tcp.GetStream();

(3) Nhận và gửi dữ liệu.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Gửi chuỗi
 
byte [] bộ đệm = Mã hóa.Unicode.GetBytes(msg); // tin nhắn là chuỗi được gửi 
 
  thử
 
      {
 
        khóa (luồng tới máy chủ)
       {
 
       streamToServer.Write(bộ đệm, 0, bộ đệm.Độ dài);   //Gửi tới máy chủ
 
        }
 
      //Nhận chuỗi
        đệm = mới byte [Kích thước bộ đệm];
        khóa (luồng tới máy chủ)
 
       {
 
         bytesRead = streamToServer.Read(bộ đệm, 0, Kích thước bộ đệm);
 
       }
 
}

1.2. Không đồng bộ.

So với đồng bộ hóa, các phương thức nhận và gửi dữ liệu trong kết nối không đồng bộ đều có chức năng gọi lại, tức là ngay cả khi không thể kết nối hoặc không nhận được dữ liệu, chương trình sẽ tiếp tục thực thi. kết nối được kết nối hoặc dữ liệu được nhận, chương trình sẽ tiếp tục thực thi, chương trình sẽ quay lại chức năng gọi lại và tiếp tục thực hiện lại. Xem chi tiết dưới đây:

máy chủ:

1. Mở giao diện nghe.

?
1
2
3
4
5
riêng tư Trình nghe TcpListener;        //Lớp nghe
 
người nghe = mới TcpListener( mới IPEndPoint(IPAddress.Parse(ip), cổng));
 
listener. Bắt đầu(); // Cho phép nghe, không giới hạn số lượng client kết nối

hoặc.

?
1
người nghe.Bắt đầu( số nguyên Tôi); // Bật nghe và chỉ có thể kết nối tối đa i khách hàng.

2. Tiếp nhận khách hàng.

Listen.BeginAcceptSocket(clientConnect, Listen);//Chấp nhận không đồng bộ yêu cầu kết nối của máy khách clientConnect là chức năng gọi lại của kết nối.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
///
 
/// Nhận chức năng gọi lại
 
///
 
///
 
riêng tư vô hiệu clientConnect(IAsyncResult ar)
 
{
 
thử
 
   {
     Trình nghe TcpListener = (TcpListener)ar.AsyncState;
     // Chấp nhận kết nối của máy khách và nhận Ổ cắm được kết nối
     Máy khách socket = listener.EndAcceptSocket(ar);
 
   }
 
   nắm lấy { }
 
}

3. Nhận dữ liệu do khách hàng gửi đến.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
///
 
/// Nhận dữ liệu không đồng bộ
 
  ///
 
  riêng tư vô hiệu nhận dữ liệu(máy khách ổ cắm)
 
{
 
    //Gọi phương thức không đồng bộ BeginReceive để báo cho socket biết cách nhận dữ liệu
   IAsyncResult iar = client.BeginReceive(bộ đệm, 0, BagSize, SocketFlags.None, ngoài errorCode, receiveCallback, bộ đệm);
 
       }
 
    }
 
     ///
 
     /// Nhận chức năng gọi lại dữ liệu
 
     ///
 
     ///
 
     riêng tư vô hiệu nhận cuộc gọi lại(IAsyncResult ar)
 
     {    
         // Độ dài của dữ liệu nhận được.
         số nguyên receL = 0;
 
         thử
 
         {
           receLen = client.EndReceive(ar, ngoài mã lỗi);       
 
nếu như (receLen > 0)
 
          {
            OnReceiveData(máy khách); //Hàm xử lý sau khi nhận dữ liệu
 
           }
         }
        nắm lấy { }
 
       }
       khác { }
 
     }

4. Sau khi tiếp nhận thành công, dữ liệu sẽ được gửi lại cho khách hàng.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
///
 
/// Gửi tin nhắn không đồng bộ
///
 
  ///
  riêng tư vô hiệu OnReceiveData (Ổ cắm ổ cắm)
 
{
      sợi dây strLogin = “đã nhận thành công”;
 
byte [] dữ liệu = Mã hóa.ASCII.GetBytes(strLogin);
 
  socket.BeginSend(dữ liệu, 0, dữ liệu.Length, SocketFlags.None, ngoài errorCode, sendCallBack, socket); //Gửi dữ liệu không đồng bộ
 
      }
 
       khác
 
       { }
 
     }
 
///
 
  /// Gửi các sự kiện gọi lại không đồng bộ
 
  ///
 
  ///
 
riêng tư vô hiệu gửiCallBack(IAsyncResult ar)
 
     {
 
socket. EndSend(ar, ngoài mã lỗi);
 
      }

khách hàng.

1. Kết nối với máy chủ.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
riêng tư TcpClient tcpcz = vô giá trị
 
  tcpcz = mới TcpClient()
 
  tcpcz.BeginConnect(địa chỉ IP, Convert.ToInt32(cổng), mới AsyncCallback(ConnectCallback), tcpcz); // Kết nối với máy chủ không đồng bộ dựa trên địa chỉ IP và số cổng của máy chủ
 
  ///
 
/// Hàm gọi lại cho kết nối không đồng bộ
 
  ///
 
  ///
 
  riêng tư vô hiệu Kết nốiCallback(IAsyncResult ar)
 
     {
 
       TcpClient t = (TcpClient)ar.AsyncState;
 
       thử
 
       {
 
         nếu như (t.Kết nối)
 
         {
 
           t. Kết thúc kết nối(ar); // Khi hàm chạy ở đây nghĩa là kết nối thành công.
 
         }
 
         khác
 
         {
 
         }
 
       }
 
       nắm lấy () { }
 
     }

2. Gửi và nhận chuỗi.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Luồng NetworkStream = tcp.GetStream(); // Luồng dữ liệu được tạo trên kết nối máy chủ
 
         //Gửi chuỗi
 
   sợi dây strĐăng nhập = “ cái này ví dụ về ổ cắm”;
 
   byte [] dữ liệu = Mã hóa.ASCII.GetBytes(strLogin);
 
  stream.BeginWrite(dữ liệu, 0, dữ liệu.Độ dài, mới AsyncCallback(Gửi cuộc gọi lại),luồng); //Gửi dữ liệu không đồng bộ
 
  //Nhận chuỗi
 
   byte [] kết quả = mới byte [tcp.Có sẵn]; // tcp.Available là kích thước chuỗi được chấp nhận
 
   thử
 
  {
 
    stream.BeginRead(kết quả, 0, kết quả.Độ dài, mới AsyncCallback(ReadCallback), luồng); // Chấp nhận không đồng bộ chuỗi được máy chủ trả về
 
   }
 
     nắm lấy { }
 
     sợi dây strResponse = Mã hóa.ASCII.GetString(kết quả).Cắt(); // Chuỗi nhận được từ máy chủ
 
  }
 
   }
 
      nắm lấy ()
 
      {
 
      }
 
    }

Trên đây là một số kinh nghiệm của mình về socket trong thời gian này mong rằng sẽ giúp ích cho việc học tập của mọi người và cũng mong mọi người ủng hộ mình.

Liên kết gốc: http://www.cnblogs.com/jamesping/articles/2071932.html.

Cuối cùng, bài viết này về mã ví dụ về giao tiếp TCP của C# Socket kết thúc tại đây. Nếu bạn muốn biết thêm về mã ví dụ về giao tiếp TCP của C# Socket, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. Hỗ trợ blog của tôi trong tương lai! .

27 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress