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));
Listener.Start();
|
(2) Phát hiện các yêu cầu kết nối từ client.
?
1
2
|
TcpClient remoteClient = listener.AcceptTcpClient();
|
(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];
số nguyên
byteĐọc;
thử
{
khóa
(luồng tới khách hàng)
{
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);
}
|
(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();
remoteClient. Đóng();
|
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);
nếu như
(tcp.Đã kết nối)
{
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
|
byte
[] bộ đệm = Mã hóa.Unicode.GetBytes(msg);
thử
{
khóa
(luồng tới máy chủ)
{
streamToServer.Write(bộ đệm, 0, bộ đệm.Độ dà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;
người nghe =
mới
TcpListener(
mới
IPEndPoint(IPAddress.Parse(ip), cổng));
listener. Bắt đầu();
|
hoặc.
?
1
|
người nghe.Bắt đầu(
số nguyên
Tôi);
|
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;
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)
{
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)
{
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);
}
}
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);
}
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);
///
/// 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);
}
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();
sợi dây
strĐăng nhập = “
cái này
là
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);
byte
[] kết quả =
mới
byte
[tcp.Có sẵn];
thử
{
stream.BeginRead(kết quả, 0, kết quả.Độ dài,
mới
AsyncCallback(ReadCallback), luồng);
}
nắm lấy
{ }
sợi dây
strResponse = Mã hóa.ASCII.GetString(kết quả).Cắt();
}
}
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! .
Tôi là một lập trình viên xuất sắc, rất giỏi!