【问题标题】:Speak to a device using TCP/IP使用 TCP/IP 与设备通话
【发布时间】:2012-04-28 23:17:30
【问题描述】:

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

我决定使用 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 个对象(输入流和输出流)

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

如果有人能照亮我的路,那就太好了!我是 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]];

}

按照我的搜索,服务器应该回复我“用户 +ok”之类的东西,但什么都没有…… 2个奇怪的东西: - 如果我打开到 SSH 服务器的 FTP 服务器的套接字,我总是毫无问题地响应“你好”。但是在 telnet 中,90% 的连接都会像这样给我一个奇怪的问候:“ÿýÿýÿûÿû”,为什么?

  • 当我发送给用户时,什么都没有发生,只有来自 handleEvent 的一个无法识别的事件...

【问题讨论】:

  • 当你这样做时会发生什么?您是否验证了 192.168.1.4(为什么要对其进行硬编码?)正在侦听端口 23?
  • 192.168.1.4 正在侦听端口 23 (telnet)。我可以通过终端到达它。我对地址进行了硬编码,以确保错误不是来自条目。当我这样做时什么都没有发生,虽然我会在日志中看到一些东西,但什么都没有:/
  • 仍然是黑的,找不到合适的 NSStream 配置,不能说话/得到服务器的响应 :(
  • 不知道为什么 [NSStream getStreamsToHost: inputStream: outputStream:] 在这里不起作用。如果适用,请考虑使用 [NSNetService getInputStream: outputStream:]。
  • “ÿýÿýÿûÿû”是 Telnet IAC 序列。阅读 RFC 854 (tools.ietf.org/html/rfc854) 了解这些是什么以及如何处理它们的详细信息。 (您可以放心地忽略其中的大多数。)

标签: objective-c macos cocoa


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2021-03-13
    • 2018-07-08
    • 1970-01-01
    • 2014-07-19
    • 2012-08-09
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多