我有一个文件服务器(基于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信号时,我应该结束读数,但它实际上不起作用,根本没有调用委托。 谢谢你的时间,希望你能给我一些建议。
答案 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]
}