Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Tạo multi kết nối client-server cùng một lúc với socket/tcpclient
Hi team,
Hiện tại mình có tạo 1 application winform kết nối từ client với server. Winform chỉ cần khai báo IP/Port, sau đó nhấn bắt đầu, sẽ kết nối đến server. Nó hoạt động bình thường. Bây giờ mình muốn tạo nhiều kết nối từ client và server. Nếu mình mở nhiều cửa sổ
ứng dụng winform, sau đó khai báo các IP/Port và nhấn kết nối, client vẫn kết nối được với server. Vấn đề bây giờ là mình muốn chỉ trong 1 cửa sổ ứng dụng winform, client khai báo list chứa nhiều ip/port. Sau đó chỉ cần nhấn bắt đầu, sẽ có kết nối giữa client-server
theo list các ip/port mà client đã khai báo.
VD 1: kết nối 1 client-server
Server: 10.240.10.100
Client: 10.240.1.10 Port 7777
Trên winform , khi Client nhấn nút bắt đầu thì kết nối đến server , và mình kiểm tra trong cmd bằng command netstat -a -n
TCP 10.240.1.10:7777 10.240.10.100:56162 ESTABLISHED
VD 2: kết nối list client-server . Trên client sẽ có listbox chứa danh sách các IP/Port :
10.240.1.10 Port 7777,
10.240.1.10 Port 8888,
10.240.1.10 Port 9999.
Mình muốn trên winform , Client khai báo list danh sách IP/Port, sau đó chỉ cần nhấn bắt đầu. Sẽ lần lượt kết nối đến server. Các dữ liệu gửi/nhận của từng kết nối riêng biệt. Kết quả sẽ kiểu như dưới đây
TCP 10.240.1.10:7777 10.240.10.100:34562 ESTABLISHED
TCP 10.240.1.10:8888 10.240.10.100:61233 ESTABLISHED
TCP 10.240.1.10:9999 10.240.10.100:43221 ESTABLISHED
private async void _startconnect(string ip, int port)
{
try
{
private TcpListener listener;
private Socket socket;
private NetworkStream stream;
listener = new TcpListener(IPAddress.Parse(_ip), _port);
listener.Start();
socket = listener.AcceptSocket();
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
socket.SendTimeout = 180000;
socket.ReceiveTimeout = 180000;
stream = new NetworkStream(socket);
while(true)
{
//code receive byte and send byte
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private async Task Start_Connect(string _ip, int _port)
{
await Task.Run(() =>
{
_startconnect(_ip, _port);
Task.Delay(300).Wait();
});
}
private async void bt_batdau_Click(object sender, EventArgs e)
{
await Start_Connect(txt_ip.Text.Trim(), Int32.Parse(txt_port.Text.Trim()));
}