/ / Program nie otwiera po napisaniu klienta TcpClient = list.AcceptTcpClient (); - c #, gniazda, programowanie sieciowe

Program nie otwiera po napisaniu klienta TcpClient = list.AcceptTcpClient (); - c #, gniazda, programowanie sieciowe

Muszę wyświetlić adres IP klienta na etykiecie na formularzu okna to jest mój kod, który napisałem

    private void Form1_Load(object sender, EventArgs e)
{
IPEndPoint end = new IPEndPoint(IPAddress.Any, 8000);
TcpListener list = new TcpListener(end);
list.Start();

TcpClient client = list.AcceptTcpClient();

label5.Text = client.Client.LocalEndPoint.ToString();
}

Kiedy komentuję klienta TcpClient = list.AcceptTcpClient () mój program się uruchamia, ale zdecydowanie nie wyświetli adresu IP klienta

Wszelkie sugestie proszę

Odpowiedzi:

1 dla odpowiedzi № 1

AcceptTcpClient() jest metodą blokującą. Jeśli zadzwonisz do niego ze swojego Load obsługa zdarzeń, która jest sama wywoływana w interfejsie użytkownikawątku, zablokujesz wątek, który ma obsługiwać interfejs użytkownika. Nic nie stanie się w twoim programie, dopóki klient rzeczywiście nie spróbuje się połączyć i AcceptTcpClient() zwraca metodę.

Możesz rozwiązać ten problem, używając asynchronicznej wersji metody. Na przykład:

private async void Form1_Load(object sender, EventArgs e)
{
IPEndPoint end = new IPEndPoint(IPAddress.Any, 8000);
TcpListener list = new TcpListener(end);
list.Start();

TcpClient client = await list.AcceptTcpClientAsync();

label5.Text = client.Client.LocalEndPoint.ToString();
}

Pozwoli to Form1_Load() metoda zwraca, gdy AcceptTcpClientAsync() wywoływana jest metoda, pozwalająca na kontynuowanie pracy wątku interfejsu użytkownika. Jeśli i kiedy klient się połączy, wykonanie twojego Form1_Load() metoda zostanie wznowiona, kopiując wynik operacji accept do pliku client zmienna, a następnie wykonywanie następnej instrukcji (tj. aktualizacja label5.Text).

Oczywiście, ponieważ kod stoi teraz, nie wydaje się, aby cokolwiek zrobić z zaakceptowanym TcpClient (inne niż zgłaszanie informacji o IP / porcie). Prawdopodobnie zamierzasz dodać więcej kodu, aby obsłużyć rzeczywiste połączenie klienta. Tak jak Ty, zawsze pamiętaj o powyższym; musisz zawsze używać wątku UI do działania i używania async/await idiom to najlepszy sposób na zrobienie tego.