私の目標は、2つのクライアント(両方で実行され、テキストメッセージと同期するGUIプログラム)の同期ワークスペースを作成することでした。 私は現在、2つのボタンを持っています。最初のボタンはサーバーとソケットを作成し、2つ目は新しいフォーム(現在空のフォームであるForm2)を開きます。 ボタン2をクリックすると、現在のクライアントのフォームが開き、他のクライアントがフォームを開くためのメッセージが送信されます。 何らかの理由で、ボタンをクリックして表示される最初のフォームは成功し、一方、最初のクライアントからのメッセージによって表示しようとしている他のクライアントは成功せず、「応答していません」。 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);
}
}
}
使用しているコードの例を挙げることはできますか?あなたはメッセージが通過していると確信していますか?ソケットが開けられたことは確かですか? 2番目のクライアントは接続されていますか? – pstrjds
コードサンプルが追加されました。 @pstrjds 両方のクライアントが接続されていますが、2番目のクライアントでフォームが表示されていますが、応答がないので、メッセージが通過しています。 サーバにもメッセージが表示されますので、接続は正常です。 –