そのため、TcpClient を使用してサーバーからデータを送受信するシステムを作成しようとしています。入ってくるデータをリッスンするスレッドがあります。
私が望むのは、次のことができるメソッドを作成できるようにすることです。
ストリームに書き込む > 応答を待つ > 応答を処理する
しかし同時に、この間に他の無関係なデータも入ってくる可能性があるため、次のことだけを行うことはできません。
writer.WriteLine("");
string response = reader.ReadLine();
この質問の「コールバック」> C#のコールバックを見ていましたが、これが必要な方法のようですが、どうすればこれを進めることができるか完全にはわかりません。
これについての助けは素晴らしいでしょう、ありがとう!
ジム・ミシェルの編集:
これは私が達成したいことのようなものです:
public bool Login(string username, string password) {
writer.Write("{ \"username\" : \"" + username + "\", \"password\" : \"" + password + "\" }";
//Somehow get the response which is being ran on another thread (See below)
//Process the JSON into a object and check is successful or not
if (msg.result == "Ok") return true;
else return false;
}
private void ReadThread()
{
while (running)
{
if (ns.DataAvailable)
{
string msg = reader.ReadLine();
if (String.IsNullOrEmpty(msg)) continue;
Process(msg); //Process the message aka get it back to the Login method
}
}
}
編集 2: 基本的に、TcpClient に書き込み、同じストリームからの応答を受信してからブール値を返すログイン メソッドを呼び出すことができるようにしたいと考えています。
しかし、そのような基本的な方法はそれをカットしません:
public bool Login(string username, string password) {
writer.Write("{ \"username\" : \"" + username + "\", \"password\" : \"" + password + "\" }";
string response = reader.ReadLine();
if (response == "success") return true;
else return false;
}
他のデータがストリームを介して自動的にプッシュされるため、これは機能しません。そのため、ReadLine() を待機しているときに、探している応答の代わりに何か他のものを取得する可能性があります。
したがって、この問題を解決できるソリューションを探しています。現在、純粋にストリームから読み取り、メッセージを処理するためのスレッドを実行しています。そのスレッドから上記のメソッドにメッセージを取得する必要があります。
これを行うことについて私が考えた1つの方法は、メッセージが読み取られたときです。これは、メッセージがグローバルリストに配置され、その後、メッセージがリスト内で見つかるまでリストをチェックするループに Login メソッドを配置できるためです。しかし、私の考えが正しければ、これはひどい概念です。だから私は代替を探しています。