1

我正在尝试使用应用程序通过套接字与 Windows 进行通信。至少,我试图至少弄清楚如何从 iPhone 创建连接(也许使用 iPhone 来 ping Windows 机器?)我不太清楚我需要从哪里开始。一般来说,我对 iOS 开发很陌生,对套接字/网络编程也是全新的。我已经尝试了几个没有让我走远的教程。我的目标是:

  • 通过套接字连接到服务器(服务器将是一台 Windows 机器,其服务等待来自 iPhone 的传入连接)
  • 我最终将向服务器发送 JSON 数据包,以及从服务器接收 JSON 数据包
  • 在 iPhone 中提出一个指示成功或失败的响应

如果可能的话,我想先编写/构建客户端,但到目前为止我已经迷路了。希望 SO 社区中的好人能够伸出援助之手,为我指明正确的方向。

提前致谢!

4

4 回答 4

3

您的问题非常广泛,尤其是它不针对特定的编程问题。我会给你一些指导方针或起点。

对于 iPhone,您需要学习如何使用NSStream,您可以从这里开始:Stream Programming Guide for Cocoa。您将需要一个输出流和一个输入流,以便您可以轻松并行地管理传出和传入通信。换句话说,您将从主类派生的NSInputStream和类中受益。当您使用流发送数据时,您将使用缓冲区发送原始数据,因此不必使用 JSON 数据包;我个人没有,但这取决于你。NSOutputStreamNSStreamuint8_t

在 Windows 上,我假设您将使用 C#,因此您需要了解TcpListener哪个 IP 地址和您指定的端口号侦听。这可以让你开始一点:TcpListener Class。您还需要TcpClient通过它读取和写入流。

对于高效的服务器,您需要异步工作,并TcpClient为此提供同步和异步方法。BackgroundWorker此外,为了获得更好的功能,您可能需要在服务器中使用线程,或者使用使事情变得更容易的内置类。

我不建议单独对客户端进行编程,然后对服务器进行编程,我相信它们应该并行进行,因为这是一种双向通信,如果您尝试这样做,您会发现您必须在这里少工作,而在那里少工作。如果我告诉您,当我在我的客户端/服务器应用程序上工作时,我的办公桌上有一台 Mac 和一台 PC,并且我每隔一段时间就会在它们之间切换,这并不奇怪。

最后,我想评论一些你没有问的问题。由于您的客户端是移动设备,因此您必须期望它并非始终处于打开状态(或始终没有 Internet 连接),因此请准备好在服务器中进行一些数据库工作,以便能够存储需要发送的消息之后...

我希望这可以帮助您入门。如果您有更具体的问题,我可能会更好地说明。顺便说一句,这份工作并不容易,但如果你真的喜欢编程,它会很有趣,尤其是当你开始获得第一个结果时;)

于 2012-05-30T21:31:06.663 回答
1

如果您真的必须使用套接字,请帮自己一个忙,并获取一个不错的套接字库,例如 AsyncSocket。https://github.com/robbiehanson/CocoaAsyncSocket

但最好还是先尝试通过 http 进行操作,并且仅在您确实必须这样做时才移动到套接字。

于 2012-05-30T21:58:03.550 回答
0

如果服务器使用某种自定义协议,您可以使用 BSD 套接字 API。如果服务器使用 HTTP 协议,则使用以下任一:

  1. NSURLConnection - 用于来自主线程的异步通信。
  2. 使用 NSData 但从单独的线程同步加载。

#2 的示例:

NSString *url = @"http://example.com";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: url]];
NSString *str = [[NSString alloc] 
    initWithBytes: [data bytes]
    length:[data length] 
    encoding: NSUTF8StringEncoding];
于 2012-05-30T20:58:26.103 回答
0

如果您使用 HTTP,如前所述,生活会容易得多。当您已经拥有像 HTTP 一样广泛和广泛使用的协议时,重新发明轮子是没有用的。

AFNetworking是一个很好的与 Web 服务器通信的库,并且内置了对 JSON 进行编码/解码的能力。

使用 AFNetworking 使用 HTTP、JSON 和 REST API 进行通信的示例。

NSMutableURLRequest *jsonRequest = [httpClient requestWithMethod:@"POST"
                                                             path:@"user/login" 
                                                       parameters:[[NSDictionary alloc] initWithObjectsAndKeys:user, @"username", password, @"password", nil]];
    //Make operation from request
    AFJSONRequestOperation *jsonOperation = 
    [AFJSONRequestOperation JSONRequestOperationWithRequest:jsonRequest
                                                    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                                                        //Block will be called when request is successful
                                                    } 
                                                    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                                        //Block will be called if request has failed
                                                    }];
    //Start request
    [httpClient enqueueHTTPRequestOperation:jsonOperation];

很容易使用,我认为它比 NSURLConnection 更容易。块的使用使其更具主动性。另外,您不必担心 JSON 编码/解码。JSON 将直接为您从 Objective-c 对象编码/解码为 JSON(或从 JSON 到 Objective-c 对象)。

于 2012-05-30T21:25:34.357 回答