我有一個文件服務器(基於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信號,但它實際上是不行的,委託沒有在全稱爲。 謝謝你的時間,希望你能給我一些建議。
謝謝,但它不工作。 - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)主機端口:(uint16_t)端口委託被調用,但 - (void)套接字:(GCDAsyncSocket *)sock didReadData:(NSData *)withTag :(長)標籤委託永遠不會被調用。 –