2016-07-07 2 views
1

Итак, я возился с некоторыми файлами iOS dev и хотел попробовать отправить некоторую строку из симулятора Xcode на сервер, на котором я работал в python. У меня никогда не было двух разных языков программирования, поэтому я думал, что это будет круто.Как заставить мой клиент-клиент поговорить с моим сервером python?

Я следовал некоторым Objective-C сокеты учебников в Интернете, и это то, что я придумал

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 
CFStreamCreatePairWithSocketToHost(NULL, 
            (CFStringRef)@"localhost", 
            5321, 
            &readStream, 
            &writeStream); 
NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream; 
NSOutputStream *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]; 

NSString *response = [NSString stringWithFormat:@"hello from obj c"]; //", inputNameField.text]; 
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
[outputStream write:[data bytes] maxLength:[data length]]; 

Затем на стороне сервера, это простой цикл, который ожидает сообщение и, как предполагается печать Это.

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

host = 'localhost' 
port = 5321 
s.bind((host, port)) 

s.listen(5) 
print("Now Listening") 
c, addr = s.accept() 
print("Connected, Waiting for message...") 
while True: 
    data = c.recv(1024) 
    print(">Recieved: " + str(data)) 

Так я думал [InputStream открыть]/[OutputStream открыть] команду команда соответствовала бы Socket.Accept() в Python, а затем [OutputStream запись:] функция будет прочитана соединением. recv() в python. Это, похоже, не так, потому что я прошел через отладчик, а команда socket.accept() не запускается до команды [outputStream write: data].

Итак, каков правильный способ сделать это? Как получить объектный код c для подключения к сокету на стороне python, а затем отправить строки, которые может получить сокет. Я попытался отправить две разные строки назад, но это похоже на то, что метод write не вызывает функцию recv().

Заранее благодарен всем!

ответ

1

Ваш код работает нормально, поэтому, я думаю, вы, вероятно, сделаете простую ошибку. Обязательно проверьте следующее:

  • Сначала запустите свой скрипт python. От терминала: python yourfilename.py
  • Показывайте Objective C код после сервера питона прослушивает и убедитесь, что код, который вы показали на самом деле запускается на выполнение (т.е. там, где в вашем проекте вы поместите этот код?)
  • Марки убедитесь, что вы сделаете свой объективный класс с, содержащий код соответствует <NSStreamDelegate> протоколу

чтобы проверить код, который я только что вставили свой Objective C код метода в стандартном классе ViewController вы получаете при запуске нового проекта Xcode , Вот код:

В ViewController.h:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController<NSStreamDelegate> 

@end 

В ViewController.m:

#import "ViewController.h" 

@implementation ViewController 

- (void)viewDidLoad 
{ 

[super viewDidLoad]; 

[self sendNetworkCommunication]; 

} 


-(void)sendNetworkCommunication { 

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 
CFStreamCreatePairWithSocketToHost(NULL, 
            (CFStringRef)@"localhost", 
            5321, 
            &readStream, 
            &writeStream); 
NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream; 
NSOutputStream *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]; 

NSString *response = [NSString stringWithFormat:@"hello from obj c"]; //", inputNameField.text]; 
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
[outputStream write:[data bytes] maxLength:[data length]]; 

} 

@end 

Тогда я побежал сценарий питона от терминала и затем запускали проект Xcode в симулятор:

enter image description here

Вы можете увидеть сообщение, отправленное с iOS.

+0

Я не был инициатором кода c до тех пор, пока сервер не сказал, что он слушает. Целевой код c просто работает в основной функции. И я на 99,99% уверен, что объявил класс как с NSStreamDelegate. Я все еще работаю прямо сейчас и не смогу проверить до сегодняшнего вечера. На стороне сервера я получаю сообщение о наличии соединения, а затем ждет входящую команду.Это инициируется линией, которая пытается отправить строку «привет от obj c», и фактическая строка никогда не кажется на сервере. Вы получаете разные результаты при запуске? – 12343211234

+0

Да. Я получаю другой результат. См. Обновленный ответ. – jsondwyer

+0

Спасибо за ответ. Я пройду через него, когда вернусь домой. Я взволнован, чтобы поиграть с ним – 12343211234

Смежные вопросы