2016-08-12 7 views
0

私はファイルサーバー(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]; 

を。 お時間をありがとう、私はいくつかのアドバイスを与えることを願っています。

答えて

0

「[靴下readDataToData:[[NSStringのstringWithFormat:@ "を追加jsut X%"、EOF] dataUsingEncodingを:NSUTF8StringEncoding] withTimeout:-1タグ:2];」このfunchtionで:

func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
    [sock readDataToData:[[NSString stringWithFormat:@"%x",EOF] dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:2] 

} 
+0

ありがとうございますが、動作していません。 - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)ホストポート:(uint16_t)ポートデリゲートが呼び出されましたが、 - (void)socket:(GCDAsyncSocket *)sock didReadData: :(長い)タグデリゲートは呼び出されません。 –

0

Iはそれを回避する方法を見つけました。私はasyncSocketのソースコード洞察力を見ると、私は、サーバーがクライアントにファイルを送信終了したら、それは自動的にclient.Soを切断することがわかった私はこのようなsocketDidDisconnectデリゲートで終わるファイルジョブを実行します。

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { 
if (flag > 0) { 
    NSLog(@"done with sync database"); 
    flag = 0; 
    ... 
} 

}

関連する問題