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 '型の未処理例外を連続ループでクラッシュします。
を読み取りをラップすることにより、読む必要があるでしょうか? どうすれば読み込むことができますか? –
フラッシュは下線付きのデバイスにフラッシュされます。バッファが途中でバッファになっているだけでなく、ループ内の読みをラップするだけです。 –
ループをメソッドconnectToServerに追加しました。 Connectボタンをクリックすると、プログラムが遅れてしまいました(クラッシュしませんでしたが、どちらも応答しませんでした)。私はこの事をタイマーに入れて1秒に1回それを行うべきですか? –