Hej, mam dosyć duży jak dla mnie problem. Chcę stworzyć komunikację klient-serwer-klient, do tego użyłem formatki + dodatkowy wątek do uruchomienia procedury połączenia klientów + nowa klasa, która tworzy wątek dla każdego podłączonego klienta. Połączenie działa, aczkolwiek chciałbym, aby w formatce, w formie głównej w textBox1 wyświetlało mi dane połączonego klienta. I tutaj jest problem, bo te dane są w innej klasie w innym wątku.
Poradziłem sobie z wyświetlaniem informacji w textBoxie z innego wątku w tej samej klasie
Invoke(new Action(() => { textBox1.Text = " >> " + "Client No:" + Convert.ToString(counter) + " started!+\n"; }));
aczkolwiek nie działa to samo w innej klasie.
Teraz trochę mojego kodu:
kod z buttonu:
private void button1_Click(object sender, EventArgs e)
{
Thread thr = new Thread(startServer);
thr.Start();
}
public void startServer()
{
IPAddress ipAd = IPAddress.Parse("127.0.0.1");
TcpListener myList = new TcpListener(ipAd, 8001);
TcpClient clientSocket = default(TcpClient);
int counter = 0;
myList.Start();
counter = 0;
while (true)
{
counter += 1;
clientSocket = myList.AcceptTcpClient();
Invoke(new Action(() => { textBox1.Text = " >> " + "Client No:" + Convert.ToString(counter) + " started!+\n"; }));
Thread.Sleep(400);
handleClinet client = new handleClinet();
client.startClient(clientSocket, Convert.ToString(counter));
}
clientSocket.Close();
myList.Stop();
Console.WriteLine(" >> " + "exit");
Console.ReadLine();
}
public class handleClinet
{
TcpClient clientSocket;
string clNo;
public void startClient(TcpClient inClientSocket, string clineNo)
{
this.clientSocket = inClientSocket;
this.clNo = clineNo;
Thread ctThread = new Thread(doChat);
ctThread.Start();
}
private void doChat()
{
int requestCount = 0;
byte[] bytesFrom = new byte[10025];
string dataFromClient = null;
Byte[] sendBytes = null;
string serverResponse = null;
string rCount = null;
requestCount = 0;
while ((true))
{
try
{
requestCount = requestCount + 1;
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
// Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient); // Nie chcę wyświetlania w konsoli, tylko w TextBox1
Invoke(new Action(() => { textBox1.Text = " >> " + "From client-" + clNo + dataFromClient; })); // TUTAJ TAKIE COŚ NIE DZIAŁA :/
rCount = Convert.ToString(requestCount);
serverResponse = "Server to clinet(" + clNo + ") " + rCount;
sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
// Console.WriteLine(" >> " + serverResponse);
}
catch (Exception ex)
{
// Console.WriteLine(" >> " + ex.ToString());
// instance.Invoke(new Action(() => { textBox1.Text = " >> " + ex.ToString();}));
}
}
}
}
Szukałem na forach, ale nigdzie nie mogłem znaleźć rozwiązania, które by rozwiązały mój problem. Ewentualnie było tak napisane i zagmatwane, że nie byłem w stanie tego rozwikłać.
Dopiero co się uczę C# i .NET, więc proszę o wyrozumiałość.