2016-08-12 69 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; 
    ... 
} 

}

相關問題