与使用TCP / IP的设备对话

时间:2012-04-28 23:17:30

标签: objective-c macos cocoa

我尝试打开TCP流来与具有cocoa应用程序的设备对话。 我在网上搜索,发现有一些可能性,但我有点卡住了。

我决定使用NSStream方式(因为它在cocoa-touch中被引用,如果我想将我的应用程序移植到iPhone我认为是有用的),所以这是我的代码:

@implementation AppDelegate

- (IBAction)connect:(id)sender {

    [NSStream getStreamsToHost:"192.168.1.4" port:23 inputStream:&inputStream outputStream:&outputStream];

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [inputStream open];
    [outputStream open];
}

// Both streams call this when events happen
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    if (aStream == inputStream) {
        [self handleInputStreamEvent:eventCode];
    } else if (aStream == outputStream) {
        [self handleOutputStreamEvent:eventCode];
    }
}

- (void)handleInputStreamEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
        case NSStreamEventHasBytesAvailable:[self readBytes];
            break;
        case NSStreamEventOpenCompleted:
            // Do Something
            break;
        default:
        case NSStreamEventErrorOccurred:
            NSLog(@"An error occurred on the input stream.");
            break;
    }

}

所以,当我点击我的连接按钮时,它应该打开流到我的主机并制作我的2个对象(输入流和输出流)

我想要达到的第一步是在NSTextView中输入inputStream,并知道主机是否已经到达......但我仍然卡住了:(

如果有人能照亮我的路,那就太好了!我是Stack Overflow的新手,我很乐意帮助社区了解我所知道的一些事情! :)


我更新了我的代码,似乎光线正在缓慢但它即将到来:) 我做了一个流到telnet服务器。我在texview中得到了“你好”。 现在,我想发送用户&密码能够将命令发送到服务器,但这是我的“发送用户和传递”按钮代码:

- (IBAction)sendusername:(id)sender {

    NSString * usernameMsg  = [NSString stringWithFormat:@"user @", [usernameField stringValue]];
    NSData * usertosend = [[NSData alloc] initWithData:[usernameMsg dataUsingEncoding:NSUTF8StringEncoding]];
    [outputStream write:[usertosend bytes] maxLength:[usertosend length]];

}

按照我的搜索,服务器应该回复我一个像“用户+确定”但没有... 2件奇怪的东西: - 如果我打开SSH服务器的FTP服务器的套接字,我总是“hello”响应没有问题。但是在telnet中,90%的连接都像我这样回答一个奇怪的问题:“ÿýÿýÿûÿû”,为什么?

  • 当我发送用户时,没有任何事情发生,只有来自handleEvent ...
  • 的无法识别的事件

1 个答案:

答案 0 :(得分:0)

我建议你看看https://github.com/robbiehanson/CocoaAsyncSocket/,一个很好的用于BSD套接字的Objective-C包装器。它允许您以良好和干净的回调方式处理事件循环上的发送 - 接收交互(它甚至为您处理自定义的“消息终止”符号,允许更多地关注实际数据包处理,而不是组合和拆分您收到的内容来自电线)。