-1
私は、TCPソケットを介して自分のサーバーをリッスンするプログラムを作成しようとしています。たとえば、アイテムの価格を更新すると、TCPサーバーに接続されているすべてのクライアントにJSON文字列が送信されます。私のC#プログラムでは、実行時にこの新しいTCPソケットを維持し、新しいデータがあるときはいつでもソケットから読み取ります。TcpClientは、新しいデータが利用できるときはいつも読んでいません。
私の問題は、TcpClient
が送信されている最初のラウンドを過ぎて読み取ることを拒否していることです。それはそれを読んで、それからただ完全に働くことを止める。コードは次のとおりです:
TcpClient _client;
static int readBytesLength = 1024;
Byte[] readBytes = new byte[readBytesLength];
private void initClientConnection() {
_client = new TcpClient();
_client.BeginConnect(SERVER_IP, SERVER_PORT, new AsyncCallback(connectCallback), _client);
}
private void connectCallback(IAsyncResult result) {
if (_client.Connected) {
Console.WriteLine("Connected!");
this.beginReading();
}
else {
Console.WriteLine("Failed to connect, trying again!");
this.initClientConnection();
}
}
private void beginReading() {
readBytes = new byte[readBytesLength];
_client.GetStream().BeginRead(readBytes, 0, readBytesLength, receiveCallback, _client.GetStream());
}
private void receiveCallback(IAsyncResult result) {
Console.WriteLine("Read Callback!");
if (_client.GetStream().CanRead) {
string response = Encoding.UTF8.GetString(readBytes);
Console.WriteLine("Stream got \n{0}", response);
}
this.beginReading();
}
また、私は1つのバッチデータを受信し、受信を停止します。
Stream got
-----Received-----
{"status":"SUCCESS","message": "Log in confirmed (2)"}
私はコードがまったく動作するのに驚いています。 'EndConnect'と' EndRead'へのあなたの呼び出しはどこですか?あなたもループのようなものはありません。そのため、クライアントに読み込みを行うように指示するだけです。私はあなたがクラスの仕組みを完全に理解するために 'TcpClient'のドキュメントをもう少し調べる必要があると思います。 –
私はMSDN上のサンプルからこれを取り除き(そして変更して)、' beginReading() ' - 'receiveCallback()' - > 'beginReading()' - > ...で十分です。また、私が非ブロッキングである必要があるので、 'while(true)'ループを通してそれを実行したくありませんでした。 「EndConnect」と「EndRead」についての記述はありませんでした。これに関してあなたが参照している記事が分かりますか? – Dilisqq
私の悪い、私は 'receiveCallback'の終わりに' beginReading'の呼び出しを逃しました。それでも、どのような例を使用しましたか? 'End'は 'Begin 'の不可欠なパートナーです。たとえば、[BeginConnect'のMSDNページ](https://msdn.microsoft.com/en-us/library/ms145193%28v=vs.110%29.aspx)には、「EndConnect」を備考セクション –