2016-08-12 74 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]; 
} 

这样,所有的数据都会被接收到,但是我不知道如何确定传输是否已经完成?

我曾尝试另一种方式是这样的:

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

我应该结束读取数据时来到-1信号,但它实际上是不行的,委托没有在全称为。 谢谢你的时间,希望你能给我一些建议。

回答

0

仅仅指刚添加“[短袜readDataToData:[[的NSString stringWithFormat:@ “%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)套接字:(GCDAsyncSocket *)sock didReadData:(NSData *)withTag :(长)标签委托永远不会被调用。 –

0

我找到了解决方法。当我看见识了asyncSocket源代码,我发现,当服务器完成的文件发送到客户端,它会自动断开client.So我结束工作文件在socketDidDisconnect委托这样的:

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

}

相关问题