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 № 1AcceptTcpClient()
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.