Я установил свой .plist для запуска приложения в фоновом режиме и настроил соединение следующим образом:
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
//open c socket:
int rc; // ret code of s.c.
int my_socket;
struct sockaddr_in dest_addr;
my_socket = socket(AF_INET, SOCK_STREAM, 0);
assert(my_socket >= 0);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(SERVER_LOC_PORT);
dest_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
memset(dest_addr.sin_zero,
'\0',
sizeof dest_addr.sin_zero);
rc = connect(my_socket,
(struct sockaddr *)&dest_addr,
(socklen_t) sizeof(dest_addr));
if(rc != 0){
return NO ;
}
NSLog(@"Start connection");
// Open a stream based on the existing socket. Then configure
// the stream for async operation.
CFStreamCreatePairWithSocket(NULL, my_socket, &readStream, &writeStream);
assert(readStream != NULL);
self.networkStreamIn = (NSInputStream *) readStream;
self.networkStreamOut = (NSOutputStream *) writeStream;
//releasers
CFRelease(readStream);
CFRelease(writeStream);
self.networkStreamIn.delegate = self;
self.networkStreamOut.delegate = self;
BOOL res = [self.networkStreamIn setProperty:NSStreamNetworkServiceTypeVoIP
forKey:NSStreamNetworkServiceType];
if(!res){
NSLog(@"Cannot connect") ;
// @TODO: Error handling here
}
[self.networkStreamIn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStreamIn open];
[self.networkStreamOut open];
Также я установил свой поток () для вызова при получении данных.Затем я читаю запись с / в сервер.Это работает.на фоне тоже.но через несколько минут (только в режиме backgound!) сервер печатает в журнале «java.net.SocketTimeoutException: Read timed out».и больше нет соединения с клиентом (устройством iOS).
Я не установил фоновый обработчик для повторного установления соединения - но он должен работать без этого обработчика (я думаю ..)!что-то с этой конфигурацией сокета?