2017-08-11 21 views
0

Telnetサーバーに接続してデータを送受信できる単純なクライアント(Windows.Formsを使用)を作成しようとしています。Telnetサーバー:データの送受信

私は正常にサーバーに接続できましたが、サーバーにデータを戻す方法を理解できません。 (その後、私は応答データを受信する方法を見つけ出す必要があるが、私はまだそこまでそれを行っていない。)

ここに私の現在のコードです:

using System; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
using System.Windows.Forms; 

namespace MUDClient { 
public partial class Form1 : Form { 
    const string SERVER_IP = "166.78.5.182"; 
    const int PORT_NO = 9999; 
    NetworkStream nwStream; 
    TcpClient client; 

    public Form1() { 
     InitializeComponent(); 
    } 

    private void btn_connect_Click(object sender, EventArgs e) { 
     connectToServer(); 
    } 

    private void btn_disconnect_Click(object sender, EventArgs e) { 
     client.Close(); 
     nwStream.Close(); 
     rtb_outputWindow.AppendText("\n\nClient: Disconnected."); 
    } 

    private void outputWindowTextChanged(object sender, EventArgs e) { 
     rtb_outputWindow.SelectionStart = rtb_outputWindow.Text.Length; 
     rtb_outputWindow.ScrollToCaret(); 
    } 

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

     new Thread(() => { 
      Thread.CurrentThread.IsBackground = true; 
      while (client.Connected) { 
       byte[] bytesToRead = new byte[client.ReceiveBufferSize]; 
       int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize); 
       updateOutputWindow(Encoding.ASCII.GetString(bytesToRead, 0, bytesRead)); 
      } 
     }).Start(); 
    } 

    private void updateOutputWindow(string text) { 
     if (InvokeRequired) { 
      Invoke(new MethodInvoker(delegate() { 
       updateOutputWindow(text); 
      })); 
     } 
     else { 
      rtb_outputWindow.AppendText(text); 
     } 
    } 

    private void userSentInput(object sender, KeyEventArgs e) { 
     RichTextBox inputField = (RichTextBox)sender; 
     string userInput = inputField.Text.Trim(); 

     if ((e.KeyData == Keys.Enter) && (sender == rtb_inputField)) { 
      if (nwStream != null) { 
       if (!string.IsNullOrWhiteSpace(userInput)) { 
        byte[] bytesToSend = Encoding.ASCII.GetBytes(userInput); 

        nwStream.Write(bytesToSend, 0, bytesToSend.Length); 
        nwStream.Flush(); 

        rtb_inputField.Clear(); 
        rtb_inputField.Update(); 
       } 
      } 
     } 
    } 
} 
} 

私のプログラムは2 RichTextBoxes(1を持っているが、ユーザー入力の場合は「サーバー出力」、受信データの場合は1つ)と、2つのボタン(接続と切断)があります。

[接続]ボタンをクリックすると、connectToServer()メソッドが実行され、サーバーとクライアント間の接続が正常に開かれます。

リッチテキストボックス(rtb_inputField)に入力するデータを送信し、ユーザーがEnterキーを押すとデータが送信されます。これは動作しない部分です。 Enterを押しても何も起こらないようです。

EDIT:コードを更新しました。私は新しいスレッド内で連続的な接続ループを追加しました。これはサーバーからのようこそ画面を見ることができるので機能します。 私はまだサーバに何も送ることができません。また、[Disconnect]ボタンをクリックすると、プログラムが例外 "System.IO.IOException '型の未処理例外を連続ループでクラッシュします。

答えて

0

は、書き込み後のストリームをフラッシュしてみてください。

nwStream.Flush() 

あなたはまた、contentiously行うフラッシュしますどのようなループに

while (client.Connected) 
{ 
    byte[] bytesToRead = new byte[client.ReceiveBufferSize]; 
    int bytesRead = s.Read(bytesToRead, 0, client.ReceiveBufferSize); 
    Console.Write(Encoding.ASCII.GetString(bytesToRead, 0, bytesRead)); 
} 
+0

を読み取りをラップすることにより、読む必要があるでしょうか? どうすれば読み込むことができますか? –

+0

フラッシュは下線付きのデバイスにフラッシュされます。バッファが途中でバッファになっているだけでなく、ループ内の読みをラップするだけです。 –

+0

ループをメソッドconnectToServerに追加しました。 Connectボタンをクリックすると、プログラムが遅れてしまいました(クラッシュしませんでしたが、どちらも応答しませんでした)。私はこの事をタイマーに入れて1秒に1回それを行うべきですか? –

関連する問題