を抜いて私はここで、これらのメソッドがあります:れる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メソッドの新しいスレッドがガベージコレクタによって処理されていますか?それとも何とか処分する必要がありますか? (私はバックグラウンドスレッドをたくさん作ってしまうわけではありません)
ここで別の簡単な例であるhttps://stackoverflow.com/questions/21510204/c-sharp-tcpclient-send-serialized-objects -using-separators –