C#の勉強でサーバーとクライアント、2つのアプリを作りクライアントからtextBoxに入力した文字をサーバーに送信するというものです。
一通り完成し少しづつ改良しているのですが、行き詰ったので質問させていただきます。
今まで正常に動いていたクライアントのVer.はtextBoxに文字を入力し、送信ボタンを押す度に
C#
1 public void Send() 2{ 3TcpClient client = new TcpClient(); 4 client.Connect("127.0.0.1", 9000); 5・・・省略・・・ 6client.Close() 7}
のようにTcpClientをnewしてIPアドレスの指定をしてソケットをClose()していました。
サーバー側は、接続を受け付けて、クライアントから文字の受信が終わればソケットをClose()としていました。
その後、無限ループでまた接続を受け付け→処理→Close()の繰り返しです。
これでは何度も同じ作業をすることになるので、クライアントのTcpClientのnewとIPアドレスの指定を一度だけして2回目以降は文字の送受信だけを行いたいと思い、下記のようにしてみました。
C#
1//メンバ変数 2 TcpClient client = new TcpClient(); 3 4 public void Send(byte num, string text) 5 { 6 if(client.Connected != true) 7 { 8 client.Connect("127.0.0.1", 9000); //TCP/IP接続を行う 9 } 10 11 //通信ストリームの取得 12 NetworkStream stream = client.GetStream(); 13 byte[] SendBuffer = Encoding.Unicode.GetBytes(num + text); 14 stream.Write(SendBuffer, 0, SendBuffer.Length);
引数などは気にしないでください。
変更箇所は、メンバ変数としてTcpClientをnewして、IPアドレスの指定はif文で分岐、処理の最後にClose()をしない、という3か所です。
サーバー側の変更箇所はClose()をしない、という1か所だけです。
そしていざ送信をすると、1回目は普通に送信出来ますが、2回目以降が反応してくれません。
デバックしながら見てみると、クライアント側はちゃんと送信までできています。今回のソースコードでいうSendBufferにはちゃんとコードが収まっています。
しかし、サーバー側は受信した際に処理が行われる場所にデバックポイントを貼っているにもかかわらず、まったく反応していません。
送信はできているハズなのですが、どうにもわかりません。
調べてみると使い捨て???みたいな事が書いてありましたが私にはよくわかりませんでした。
以上、どうすれば2回目以降も送受信ができるのか教えてください。
よろしくお願いいたします。
サーバーのコードです。(今回必要と思う箇所だけ抜粋)
C#
1 //// 接続待ち開始ボタンのクリックイベント 2 private void button1_Click(object sender, EventArgs e) 3 { 4 if (SLTAlive == false) 5 { 6 // スレッド終了指示フラグを未終了に設定 7 SLTAlive = true; 8 9 // 接続待ち用スレッドを作成 10 ListeningCallbackThread =new Thread(Start); 11 12 // 接続待ち用スレッドを開始 13 ListeningCallbackThread.Start(); 14 15 } 16 } 17 18 19 //========================================= 20 21//接続要求受け入れ開始 22 public void Start() 23 { 24 25 // 接続要求受け入れ開始 26 server.Start(); 27 form.label1.Text = "サーバー開始"; 28 29 try 30 { 31 // 受信の受付を行なうための無限ループ 32 33 while (form.SLTAlive == true) // スレッド終了指示フラグでの終了指示がある場合はループ終了 34 { 35 // 受信接続キュー内で、接続待ちがあるか判断 36 if (server.Pending() == true) 37 { 38 // クライアントからの接続を受け付ける 39 TcpClient ClientSocket = server.AcceptTcpClient(); 40 41 // 通信ストリームの取得 42 NetworkStream stream = ClientSocket.GetStream(); 43 44 //Receiveメソッドの呼び出し 45 Receive(stream); 46 47 } 48 49 // 短時間だけ待機 50 51 Thread.Sleep(100); 52 53} 54 } 55 catch (Exception ex) 56 { 57 form.label1.Text = "サーバー終了"; 58 } 59 60 } 61 62 //========================================= 63 64//クライアントからの受信 65 public void Receive(NetworkStream stream) 66 { 67 // クライアントからの電文の受信 68 byte[] ReceiveDate = new byte[2000]; 69 stream.Read(ReceiveDate, 0, ReceiveDate.Length); 70 71 string str = new string(Encoding.Unicode.GetString(ReceiveDate, 0, ReceiveDate.Length).ToCharArray()); //オブジェクトの生成 72 str = str.TrimEnd("\0".ToCharArray()); 73 74・・・以下省略・・・ 75 }


回答4件
あなたの回答
tips
プレビュー