redditでもあなたの質問に答えましたが、他の誰かがこの種のことを探している場合に備えて、ここで答えると思いました.
サーバーが読み取りを処理する方法には、2 つの問題があります。まず、クライアント オブジェクトのコンストラクター:
Public Sub New(ByVal client As TcpClient)
'New client connects
Me.client = client
client.GetStream().BeginRead(New Byte() {0}, 0, 0, AddressOf Read, Nothing)
End Sub
BeginRead は、コールバック メソッドに渡すことができる方法でデータを収集することを想定しています。この場合は「読む」。通常、これは、この非同期操作の「状態」を保持する新しいオブジェクトを作成し、それを最後のパラメーターとして BeginRead に渡すことによって行われます。ここでのメソッド呼び出しは新しいバイト配列を作成していますが、メソッドへの最後の引数として渡すための参照を保持していません。つまり、この呼び出しによって読み取られるデータは、読み取られた後に消えるだけです。これは、データを格納するメソッドに渡されることはないためです。
次に、読み取り操作:
Public Sub Read(ByVal ar As IAsyncResult)
Dim reader As New StreamReader(client.GetStream())
clientPacket &= reader.ReadLine()
client.GetStream().BeginRead(New Byte() {0}, 0, 0, AddressOf Read, Nothing)
End Sub
非同期呼び出しで読み取られたデータを渡していないため、ここで新しい StreamReader を作成して、クライアントからより多くのデータを取得しています。これは非同期メソッド呼び出しではありません。Reader.ReadLine() 呼び出しは改行が検出されるまでブロックされ、その時点でデータが clientPacket に追加されます。次に、上記と同じ問題で BeginRead を再度呼び出します。つまり、より多くのデータが失われます。
さらに、ストリームで EndRead() を呼び出して AsyncResult オブジェクトをクリアすることはありません。これにより、CLR が非同期操作のワーカー スレッドを使い果たしたときに、最終的にリソースが枯渇します。
この種のタスクを実装する方法の例を次に示します。それは私が最も快適であるため、C#にあります。申し訳ありません。;)
クライアントコード
サーバーコード
これが役立つことを願っています!