如何在不知道文件长度的情况下使用asyncSocket读取文件?
问题描述:
我有一个文件服务器(基于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信号,但它实际上是不行的,委托没有在全称为。 谢谢你的时间,希望你能给我一些建议。
答
仅仅指刚添加“[短袜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]
}
答
我找到了解决方法。当我看见识了asyncSocket源代码,我发现,当服务器完成的文件发送到客户端,它会自动断开client.So我结束工作文件在socketDidDisconnect委托这样的:
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
if (flag > 0) {
NSLog(@"done with sync database");
flag = 0;
...
}
}
谢谢,但它不工作。 - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)主机端口:(uint16_t)端口委托被调用,但 - (void)套接字:(GCDAsyncSocket *)sock didReadData:(NSData *)withTag :(长)标签委托永远不会被调用。 –