2016-07-07 61 views
1

所以我搞砸了一些iOS開發的東西,並想嘗試從Xcode模擬器發送一些字符串到我在Python中運行的服務器。我從來沒有談過兩種不同的編程語言,所以我認爲這很酷。如何讓我的objective-c客戶端與我的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] /在python [OutputStream的打開]命令將對應於socket.accept()命令,然後將[OutputStream中寫入:]函數將通過連接來讀取。在python中的recv()方法。這似乎並不是這種情況,但是因爲我使用了調試器,並且直到[outputStream write:data]命令才觸發socket.accept()命令。

那麼最好的方法來做到這一點?我如何獲得目標c代碼連接到python端的套接字,然後發送套接字可以接收的字符串。我試着背靠背發送兩個不同的字符串,但它就像寫法不會觸發recv()函數。

在此先感謝大家!

回答

1

您的代碼工作正常,所以我認爲您可能會犯一個簡單的錯誤。一定要檢查以下內容:

  • 首先啓動您的python腳本。從終端:python yourfilename.py
  • 運行蟒蛇服務器後,您的目標的C代碼是聽確保您實際上已經顯示的代碼被執行(即凡在你的項目中你把這個代碼片段?)
  • 製作確保您進行包含代碼的目標C類符合<NSStreamDelegate>協議

要測試你的代碼開始一個新的Xcode項目,當我剛剛粘貼你的目標C代碼標準的ViewController類,你得到的方法。下面是代碼:

在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 

然後我跑了來自終端的python腳本和然後跑了Xcode項目中模擬器:

enter image description here

您可以看到iOS發送的消息。

+0

直到服務器說它正在偵聽之前,我纔開始客觀c代碼。目標c代碼只是在主函數中運行。而且我99.99%確定我像NSStreamDelegate一樣聲明瞭這個類。我現在仍在工作,直到今天晚上才能夠檢查。在服務器端,我收到有連接的消息,然後等待傳入的命令。這是由嘗試發送字符串「hello from obj c」的行觸發的,而實際的字符串似乎永遠不會傳遞給服務器。你運行它時會得到不同的結果嗎? – 12343211234

+0

是的。我得到了不同的結果。請參閱最新的答案。 – jsondwyer

+0

感謝您的回答。當我回家時我會經歷它。我很高興能和它一起玩 – 12343211234

相關問題