2017-08-18 17 views
1

を抜いて私はここで、これらのメソッドがあります:れるtcpClientは、どのように適切に接続するには、接続を維持し、最終的に

private void connectToServer() { 
     client = new TcpClient(SERVER_IP, PORT_NO); 
     nwStream = client.GetStream(); 

     writer = new StreamWriter(client.GetStream()); 
     writer.AutoFlush = true; 
     connected = true; 

     getDataFromServer(); 
     rtb_inputField.Select(); 

     if (getDataTimer == null) { 
      getDataTimer = new System.Timers.Timer(); 
      getDataTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      getDataTimer.Interval = 1000; 
      getDataTimer.Enabled = true; 
     } 
    } 

    private void disconnectFromServer() { 
     if (connected) { 
      writer.WriteLine("quit"); 
      getDataTimer.Enabled = false; 
      getDataTimer.Dispose(); 
      getDataTimer = null; 

      Thread.Sleep(1000);  //Wait 1 second 
      nwStream.Close(); 
      client.Close(); 
      rtb_outputWindow.AppendText("\n\nClient: Disconnected."); 
     } 
     connected = false; 
    } 

    private void getDataFromServer() { 
     if (connected) { 
      new Thread(() => { 
       Thread.CurrentThread.IsBackground = true; 
       byte[] bytesToRead = new byte[client.ReceiveBufferSize]; 
       int readData = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); 
       updateOutputWindow(Encoding.Default.GetString(bytesToRead, 0, readData)); 
      }).Start(); 
     } 
    } 

    private void updateOutputWindow(string text) { 
     string newText = string.Empty; 

     if (InvokeRequired) { 
      Invoke(new MethodInvoker(delegate() { 
       updateOutputWindow(text); 
      })); 
     } 
     else { 
      newText = startRTFString; 
      newText += rtb_outputWindow.Rtf; 
      newText += replaceAnsiColorCodes(text); 

      rtb_outputWindow.Rtf = newText; 
     } 
    } 

    private void OnTimedEvent(object source, ElapsedEventArgs e) { 
     if (connected) { 
      getDataFromServer(); 
     } 
    } 

このすべての作品を、しかし、何かが間違っています。 outputWindowを切断すると、最後に "Client:Disconnected"と言う前にたくさんの改行が得られます。サーバーに接続している時間が長くなればなるほど、切断に時間がかかります。

私はタイマーがこの問題と関係していると思います。タイマーの仕事は、サーバからのデータを継続的に要求し、何かが受信された場合にそれを出力することです。それを行う良い方法はありますか?おそらく "サーバーがデータを送信するのを待つ" - 何も何秒間も送信されない場合、私は要求のためにサーバーを叩く必要はありません。

getDataFromServerメソッドの新しいスレッドがガベージコレクタによって処理されていますか?それとも何とか処分する必要がありますか? (私はバックグラウンドスレッドをたくさん作ってしまうわけではありません)

+0

ここで別の簡単な例であるhttps://stackoverflow.com/questions/21510204/c-sharp-tcpclient-send-serialized-objects -using-separators –

答えて

0

着信データを受信するためのタイマーは必要ありません。これは自動的に処理されます。リスニングスレッドタスクが呼び出されるたびに、着信データを取得し、タスクを終了して他のスレッドが実行できるようにする必要があります。

ここでは、自分のプロジェクトのリスニングタスクのサンプルがあります。入力データはシリアル化された文字列です。ここ

void ListeningObjectTask()// Recieves any data sent by the other user. 
     { 
      while (client != null && client.Connected)// If there is another user and they are connected. 
      { 
       try// This suppresses exceptions thrown by connection problems, such as the user losing network signal. 
       { 
        recieve = str.ReadLine();// Gets the data sent by the other user. 
        if (recieve != "")// If the user has sent data. 
        { 
         lock (recievedStrings)// Locks the buffer to add the data sent by the other user to it. 
         { 
          recievedStrings.Enqueue(recieve); 
         } 
         recieve = "";// Clears the incoming data, as it has been stored. 
        } 
       } 
       catch (Exception Ex) 
       { 
        // Ends all the other multiplayer objects as the connection has ended and they are no longer needed. 
        Disconnect(); 
        // Tells the user why they have lost connection, so that they can try to fix the problem. 
        MessageBox.Show("Network connection ended\n" + Ex); 
       } 
      } 
     } 

使用されるオブジェクトの宣言である。

private TcpClient client;// Allows connections for tcp network services. 
private StreamReader str; // Provides an interface to read from a stream. 
private string recieve;// The incoming string recieved from the other user. 
readonly Queue<string> recievedStrings = new Queue<string>();// A buffer to hold incoming data from the other user. 
+0

これをすべて私が現在使っているものにどのように結びつけるのですか?私はTCPListenerが必要ですか? –

+2

これは私にとってC#ソケットのチュートリアルを投稿する場所ではありません。あなたが非常に特定の問題を抱えている場合、あなたは私のEメールを送ることができます(私のプロフィールページにあります)。 – 0liveradam8

関連する問題