Я новичок в C#, и я хочу написать чат-программу, используя поток, в котором есть две нити в каждой стороне (одна для прослушивания и другая для отправки сообщений).Приложение для чата Windows Form Использование потоков
Однако потоки не могут работать с компонентами (то есть с текстовым полем), потому что другой поток уже поймал это.
Вот мои коды:
стороне сервера:
private TcpClient clientSocket;
private void btnStartListening_Click(object sender, EventArgs e)
{
TcpListener serverSocket = new TcpListener(int.Parse(txtPort.Text));
int requestCount = 0;
clientSocket = default(TcpClient);
serverSocket.Start();
txtReceivedMessages.Text +=" >> Server Started\n";
clientSocket = serverSocket.AcceptTcpClient();
txtReceivedMessages.Text += " >> Accept connection from client\n";
requestCount = 0;
Thread t = new Thread(listeningThread);
t.Start();
clientSocket.Close();
serverSocket.Stop();
}
private void listeningThread()
{
while (true)
{
try
{
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
string serverResponse = "Last Message from client" + dataFromClient;
networkStream.Flush();
txtReceivedMessages.Text += dataFromClient;
txtReceivedMessages.Update();
}
catch (Exception ex)
{
txtReceivedMessages.Text += ex.ToString() + "\n";
}
}
}
private void btnSend_Click(object sender, EventArgs e)
{
NetworkStream networkStream = clientSocket.GetStream();
Byte[] data = Encoding.ASCII.GetBytes(txtSendMessage.Text);
networkStream.Write(data, 0, data.Length);
}
стороне клиента:
private NetworkStream serverStream;
private void btnSend_Click(object sender, EventArgs e)
{
serverStream = clientSocket.GetStream();
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtMsgToSend.Text + "$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
private void listeningThread()
{
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
txtReceivedMsgs.Text += ">>" + returndata;
txtMsgToSend.Text = "";
txtMsgToSend.Focus();
}
private void btnSetConfiguration_Click(object sender, EventArgs e)
{
txtReceivedMsgs.Text += "Client Started";
clientSocket.Connect(txtIP.Text, int.Parse(txtPort.Text));
lblStatus.Text = "Client Socket Program - Server Connected ...";
}
Вы не задали вопрос. – Servy
вам нужно исследовать методы 'Invoke' или' BeginInvoke'. Они могут выполнить код, который бросает исключение в основной поток, который создал элемент управления, который вы хотите манипулировать, например, TextBox. –
. Уважаемый @Mong Zhu. У меня есть ошибка в первой строке функции listenThread (на стороне сервера): Не удается получить доступ к расположенному объекту. – fateme