【发布时间】:2016-07-07 00:14:24
【问题描述】:
所以我在搞乱一些 iOS 开发的东西,想尝试从 Xcode 模拟器发送一些字符串到我在 python 中运行的服务器。我从来没有谈过两种不同的编程语言,所以我觉得那会很酷。
我在网上关注了一些objective-c socket教程,这就是我想出的
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 open]/[outputStream open]命令会对应python中的socket.accept()命令,然后connection.recv()方法会读取[outputStream write:]函数在蟒蛇。但情况似乎并非如此,因为我使用调试器逐步完成,直到 [outputStream write:data] 命令才触发 socket.accept() 命令。
那么正确的方法是什么?如何让目标 c 代码连接到 python 端的套接字,然后发送套接字可以接收的字符串。我尝试背靠背发送两个不同的字符串,但这就像 write 方法不会触发 recv() 函数。
提前谢谢大家!
【问题讨论】:
标签: python ios objective-c sockets