私はファイルサーバー(Javaベース)を持っています。これはとても簡単です。クライアントが接続すると、クライアントにファイルが自動的に送信されます。 クライアント側では、readメソッドが-1を返すまで、ソケットから読み取るだけで非常に簡単です。 Javaを 実装するコードベースは、次のようになりますファイルの長さを知らずにasyncSocketでファイルを読み取る方法は?
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int size = 0;
while((size = is.read(buffer)) != -1){
LogUtils.LOGD(TAG,"we have data in");
...
}
しかし、今私は、iOSデバイス上でクライアントを実装したい、と私はAsyncSocketを展開、
[sock connectToHost:hostname onPort:SYNC_DATABASE_PORT error:&err];
[sock readDataWithTimeout:3.0 tag:2];
、その後、ときデリゲートコールバック:
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSLog(@"didReadData read data,len:%ld",(unsigned long)[data length]);
if (tag == 2) {
_totalReceivedLen += [data length];
[sock readDataWithTimeout:0.5 tag:2];
[self writeFile:data];
}
このようにして、すべてのデータが受信されますが、送信が完了したかどうかを判断する方法はわかりません。
私はこのような別の方法で試してみました:私は、データが-1信号に来たときに読み取りを終了することになったが、それは実際に動作しない、デリゲートは全く呼び出されなかった
[sock readDataToData:[[NSString stringWithFormat:@"%x",EOF] dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:2];
を。 お時間をありがとう、私はいくつかのアドバイスを与えることを願っています。
ありがとうございますが、動作していません。 - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)ホストポート:(uint16_t)ポートデリゲートが呼び出されましたが、 - (void)socket:(GCDAsyncSocket *)sock didReadData: :(長い)タグデリゲートは呼び出されません。 –