У меня проблема с разработкой tcp-сервера/клиента в задаче c с Bonjour.
На стороне сервера я правильно открываю потоки и использую функцию handleEvent для отправки и получения данных. Но я не знаю, как правильно отправлять и получать данные. Я прочитал этот отличный пост: Правильный способ отправки данных через сокет с NSOutputStream Поэтому я использую систему очереди пакетов для отправки данных:
switch(eventCode) {
case NSStreamEventOpenCompleted: {
NSLog(@"Complete");
} break;
case NSStreamEventHasSpaceAvailable: {
if (stream == _outputStream)
[self _sendData];
} break;
...
- (void)_sendData {
flag_canSendDirectly = NO;
NSData *data = [_dataWriteQueue lastObject];
if (data == nil) {
flag_canSendDirectly = YES;
return;
}
uint8_t *readBytes = (uint8_t *)[data bytes];
readBytes += currentDataOffset;
NSUInteger dataLength = [data length];
NSUInteger lengthOfDataToWrite = (dataLength - currentDataOffset >= 1024) ? 1024 : (dataLength - currentDataOffset);
NSInteger bytesWritten = [_outputStream write:readBytes maxLength:lengthOfDataToWrite];
currentDataOffset += bytesWritten;
if (bytesWritten > 0) {
self.currentDataOffset += bytesWritten;
if (self.currentDataOffset == dataLength) {
[self.dataWriteQueue removeLastObject];
self.currentDataOffset = 0;
}
}
}
. Так что в основном я просто отправляю свои данные по многим пакетам. Но я не вижу, как восстановить данные на стороне клиента. И я думаю, что неправильно понял событие NSStreamEventHasBytesAvailable. Потому что здесь я отправляю много пакетов, но это событие на стороне клиента вызывается только один раз. И когда я восстанавливаю данные из буфера, данные кажутся поврежденными. Я был бы очень признателен, если бы кто-то мог все это прояснить, документация не очень ясна в этом вопросе (или, может быть, я что-то упускаю ..).
case NSStreamEventHasBytesAvailable: {
if (stream == _inputStream)
{
//read data
uint8_t buffer[1024];
int len;
while ([_inputStream hasBytesAvailable])
{
len = [_inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
//NSData *theData = [[NSData alloc] initWithBytes:buffer length:len];
UnitySendMessage("AppleBonjour_UnityNetworkManager(Clone)", "OnLocalClientReceiveMessageFromServer", [output cStringUsingEncoding:NSUTF8StringEncoding]);
}
}
}