如何在不知道文件长度的情况下使用asyncSocket读取文件?

时间:2016-08-12 04:24:39

标签: ios eof asyncsocket

我有一个文件服务器(基于java),它非常简单,当客户端连接到它时,它会自动将文件发送到客户端。 在客户端,它也很简单,它只是从套接字读取,直到read方法返回-1。 基于java的实现代码如下所示:

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];
}

通过这种方式,所有数据都将被接收,但我不知道如何确定传输是否已经完成?

我尝试过另外一种方式:

[sock readDataToData:[[NSString stringWithFormat:@"%x",EOF] dataUsingEncoding:NSUTF8StringEncoding]  withTimeout:-1 tag:2];

当数据传到-1信号时,我应该结束读数,但它实际上不起作用,根本没有调用委托。 谢谢你的时间,希望你能给我一些建议。

1 个答案:

答案 0 :(得分:0)

jsut add“[sock readDataToData:[[NSString stringWithFormat:@”%x“,EOF] dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:2];”in this funchtion:

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

}