Моя цель состояла в том, чтобы создать синхронизированное рабочее пространство для двух клиентов (программа GUI, работающая на обоих из них и синхронизирующая с текстовыми сообщениями). У меня есть две кнопки в настоящее время, первая создает сокет с сервером, а вторая открывает новую форму (Form2, которая в настоящее время является пустой формой). Нажатие кнопки 2 откроет форму для текущего клиента и отправит сообщение другому клиенту, чтобы открыть форму. По какой-то причине первая форма, которая отображается нажатием кнопки, преуспевает, тогда как другой клиент, который пытается показать сообщение от первого клиента, не удался и «не отвечает». Почему форма со второго клиента не отвечает? В обоих клиентах экземпляр Form2 определен ранее. Код на обоих клиентах - это тот же код. Примеры кода: 1 Подключение к серверу с помощью кнопки 1 нажав:Попытка открыть форму, получив сообщение с сервера
private void button1_Click(object sender, EventArgs e)
{
try
{
IPAddress ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
Socket Server_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
Server_Socket.Connect(remoteEP);
Thread SendingThread = new Thread(new ParameterizedThreadStart(CrazySendingThread));
Thread RecievingThread = new Thread(new ParameterizedThreadStart(CrazyReceivingThread));
SendingThread.Start(Server_Socket); /*A thread that always sends the messages in 'msgtosend' list.*/
RecievingThread.Start(Server_Socket);/* A thread that always try to receive a message from the server(if there isn't it waits).*/
}
catch (ArgumentNullException ane)
{
Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
}
catch (SocketException se)
{
Console.WriteLine("SocketException : {0}", se.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Unexpected exception : {0}", ex.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
2- Открыть новую форму с помощью кнопки 2 нажатия:
private void button2_Click(object sender, EventArgs e)
{msgtosend.Add(Encoding.ASCII.GetBytes("/OpenNP"));
Np.Show();/* Np is defined as a global variable and built in Form1_load*/}
3- CrazyReceivingThread - нить, которая всегда пытается получить:
public void CrazyReceivingThread(object srv)
{
string msg = "";
Socket srvr = (Socket)srv;
byte[] data = new byte[1024];
while (true)
{
System.Threading.Thread.Sleep(20);
int bytesRec = srvr.Receive(data);
msg = Encoding.ASCII.GetString(data, 0, bytesRec);
string[] msg_array = msg.Split(' ');
try {
switch (msg_array[0])
{
case "/Mouse_pos":
{/*is not relevant for the question...*/}break;
case "/OpenNP":
{
try
{
Np.Show();
}
catch /*The form is 'Not responding' but this exception is **not** being caught.*/
{
Console.WriteLine("Form is not shown.");
}
}
break;
}
} catch(ArgumentNullException e) {
Console.WriteLine(e.Message);
}
}
}
Можете привести пример кода, который вы используете? Вы уверены, что сообщение проходит? Вы уверены, что сокет был открыт? Связан ли второй клиент? – pstrjds
Образцы кодов. @pstrjds Оба клиента подключены, я вижу форму во втором клиенте, но он не отвечает так yeh, сообщение проходит. Я также вижу сообщение на сервере, так что соединение в порядке. –