2016-01-03 3 views
0

Правильно, я хочу создать соединение с моим сервером (TCP Open) для этого Я изучаю с этим tutorial из apple docs (Нет, я не хочу использовать другие проекты). Ниже мой код:Настройка Socket Streams не работает

ViewController.h

@interface ViewController : UIViewController <NSStreamDelegate>{ 

} 

@property (nonatomic, retain) NSInputStream *inputStream; 

@property (nonatomic, retain) NSOutputStream *outputStream; 

@end 

ViewController.m

- (IBAction)searchForSite:(id)sender 
{ 

    NSString *urlStr = @"http://mysitefake.com/host.php"; 
    if (![urlStr isEqualToString:@""]) { 
     NSURL *website = [NSURL URLWithString:urlStr]; 
     if (!website) { 
      NSLog(@"is not a valid URL"); 
      return; 
     } 

     CFReadStreamRef readStream; 
     CFWriteStreamRef writeStream; 
     CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[website host], 80, &readStream, &writeStream); 

     inputStream = (__bridge_transfer NSInputStream *)readStream; 
     outputStream = (__bridge_transfer NSOutputStream *)writeStream; 
     [inputStream setDelegate:self]; 
     [outputStream setDelegate:self]; 
     [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [inputStream open]; 
     [outputStream open]; 

     /* Store a reference to the input and output streams so that 
     they don't go away.... */ 

    } 
} 

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { 

    switch(eventCode) { 
     case NSStreamEventHasSpaceAvailable: 
     { 
      NSLog(@"has space available"); 
      if (stream == outputStream) { 
       NSLog(@"Equals"); 
       NSString * str = [NSString stringWithFormat: 
            @"String to send to my server"]; 
       const uint8_t *rawstring = (const uint8_t *)[str UTF8String]; 
       [outputStream write:rawstring maxLength:10240]; 
       [outputStream close]; 
      }else{ 
       NSLog(@"Not equals"); 
      } 
      break; 
     } 
      default: 
      break; 
    } 
} 

И в моем сервере есть PHP-файл со следующим кодом:

host.php

<?php 
error_reporting(E_ALL); 
/* Get the port for the WWW service. */ 
$service_port = getservbyname('www', 'tcp'); 

/* Get the IP address for the target host. */ 
$address = gethostbyname('www.mysitefake.com'); 

/* Create a TCP/IP socket. */ 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: " . 
     socket_strerror(socket_last_error()) . "\n"; 
} 

echo "Attempting to connect to '$address' on port '$service_port'..."; 
$result = socket_connect($socket, $address, $service_port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) " . 
      socket_strerror(socket_last_error($socket)) . "\n"; 
} 

$in = "HEAD/HTTP/1.1\r\n"; 
$in .= "Host: www.mysite.com\r\n"; 
$in .= "Connection: Close\r\n\r\n"; 
$out = ''; 

echo "Sending HTTP HEAD request..."; 
socket_write($socket, $in, strlen($in)); 
echo "OK.\n"; 

echo "Reading response:\n\n"; 
while ($out = socket_read($socket, 2048)) { 
    echo $out; 
} 

socket_close($socket); 
?> 

Большой выход из PHP файла:

Попытка подключиться к 'Фиктивный Ip' порт '80' ... Отправка HTTP запрос HEAD, ... OK. Чтение ответа: HTTP/1.1 200 OK Дата: Вс, 03 Янв 2016 15:53:10 GMT Сервер: Apache Cache-Control: max-age = 31536000 Истекает: пн, 02 янв 2017 15:53:10 GMT Вариа: Accept-Encoding, User-Agent Connection: закрыть Content-Type: text/html; кодировка = UTF-8

Выход из приложения является:

Имеет доступное пространство Равно

Кажется, что что-то было послано, но когда я пытаюсь проверить его в хозяина .php Я не вижу сообщение, которое было отправлено, которое в этом случае было «String для отправки на мой сервер».

В чем проблема с моим кодом?

ответ

0

Я подозреваю, что у вас есть веб-сервер Apache, работающий на порту 80, возможно, содержащий ваш тестовый скрипт PHP. Приложение открывает клиентское соединение с портом 80, что означает, что он будет разговаривать с Apache. Ваш PHP-скрипт также открывает клиентское соединение с портом 80, поэтому он также будет подключаться к Apache (это объясняет сообщения Apache, которые вы получаете в своем журнале PHP). То, как вы пытаетесь настроить соединение, для меня не имеет смысла. Обычно у вас будет одно приложение, работающее как сервер. Это означает, что он открыл гнездо для прослушивания на определенном порту. Затем у вас есть второе приложение, открывающее клиентское соединение с указанным портом и отправку некоторых исходных данных. Слушающий сервер получит эти данные и отреагирует, отправив обратно некоторые данные и т. Д. Следующее учебное пособие - это настройка такого клиентского соединения с сервером.