所以我搞砸了一些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()函數。
在此先感謝大家!
直到服務器說它正在偵聽之前,我纔開始客觀c代碼。目標c代碼只是在主函數中運行。而且我99.99%確定我像NSStreamDelegate一樣聲明瞭這個類。我現在仍在工作,直到今天晚上才能夠檢查。在服務器端,我收到有連接的消息,然後等待傳入的命令。這是由嘗試發送字符串「hello from obj c」的行觸發的,而實際的字符串似乎永遠不會傳遞給服務器。你運行它時會得到不同的結果嗎? – 12343211234
是的。我得到了不同的結果。請參閱最新的答案。 – jsondwyer
感謝您的回答。當我回家時我會經歷它。我很高興能和它一起玩 – 12343211234