460
Chương 11: Lập trình mạng
cung cấp thuộc tính
Socket
, nhưng khả năng truy xuất của nó là
protected
, nghĩa là bạn
không thể truy xuất nó một cách trực tiếp. Thay vào đó, bạn phải dẫn xuất một lớp mới từ
TcpListener
:
public class CustomTcpListener : TcpListener {
public Socket Socket {
get {return base.Server;}
}
public CustomTcpListener(IPAddress ip, int port) : base(ip, port) {}
}
Bây giờ, bạn có thể sử dụng lớp này khi tạo một
TcpListener
. Ví dụ dưới đây sử dụng cách
tiếp cận này để thiết lập một tùy chọn socket:
CustomTcpListener listener =
new CustomTcpListener(IPAddress.Parse("127.0.0.1"), 8000);
listener.Socket.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 1000);
// (Sử dụng CustomTcpListener giống như đã sử dụng TcpListener.)
11.
11.
T o m t TCP-server h -tr -đa-ti u-trình
ạ ộ
ỗ ợ
ể
T o m t TCP-server h -tr -đa-ti u-trình
ạ ộ
ỗ ợ
ể
Bạn muốn tạo một TCP-server có thể cùng lúc xử lý nhiều TCP-client.
Sử dụng phương thức
AcceptTcpClient
của lớp
TcpListener
. Mỗi khi có một
client mới kết nối đến, khởi chạy một tiểu trình mới để xử lý yêu cầu và gọi
TcpListener.AcceptTcpClient
lần nữa.
Một endpoint TCP (địa chỉ IP và port) có thể phục vụ nhiều kết nối. Thực ra, hệ điều hành
đảm đương phần lớn công việc giùm bạn. Những gì bạn cần làm là tạo một đối tượng thợ
(worker object) trên server để xử lý mỗi kết nối trong một tiểu trình riêng.
Xét lớp TCP-client và TCP-server đã được trình bày trong mục 11.8. Bạn có thể dễ dàng
chuyển server này thành một server hỗ-trợ-đa-tiểu-trình để thực hiện nhiều kết nối cùng một
lúc. Trước hết, tạo một lớp để tương tác với một client:
using System;
using System.Net;
using System.Net.Sockets;
using System.IO;