0

そのため、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 メソッドを配置できるためです。しかし、私の考えが正しければ、これはひどい概念です。だから私は代替を探しています。

4

1 に答える 1

0

私の間違い。クライアントを作成したいだけだと思います。以下の多くはまだ関連しています。特に、リンクされた回答の非同期の読み取り/書き込みに関するものです。おそらくそこから関連する部分を掘り下げることができます。または [TcpClient 非同期例] で検索してください。良いサンプルがいくつかあります。

.NET で最も簡単な方法は、TcpListenerBeginAcceptTcpClientを使用して非同期的に接続を作成することです。からネットワーク ストリームを取得し、BeginRead /およびBeginWrite /をTcpClient使用して、非同期の読み取りと書き込みを行うことができます。EndReadEndWrite

リンクされたトピックには、いくつかの良い例があります。SO どこかに TCP リスナーの例があります。. .

あはは!ここにあります:https://stackoverflow.com/a/6294169/56778

于 2013-06-26T20:53:25.873 に答える