I am new in C# and I want to write a chat program using thread in which there are two threads in each side (one for listening and another for sending messages).
However, threads could not work with components (i.e. Textbox) because another thread already catch that.
Here is my codes:
server side:
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);
}
client side:
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 ...";
}