使用套接字的iPhone通信

时间:2012-05-30 20:11:11

标签: iphone ios json sockets

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

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

如果可能的话,我想首先编写/构建客户端部分,但到目前为止我已经丢失了。希望SO社区中的好朋友可以伸出援手,指出我正确的方向。

提前致谢!

4 个答案:

答案 0 :(得分:3)

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

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

在Windows上我假设您将使用C#,因此您需要学习TcpListener,它会侦听您指定的某个IP地址和端口号。这可以让你有点兴奋:TcpListener Class。您还需要TcpClient来读取和写入流。

对于高效的服务器,您需要异步工作,TcpClient具有同步和异步方法。另外,为了获得更好的功能,您可能需要在服务器中使用线程,或使用内置的BackgroundWorker类,这样可以更轻松。

我不建议单独编写客户端,然后是服务器,我相信它们应该并行,因为它是双向通信,如果你尝试,你会发现你必须在这里工作很少而且很少。如果我告诉你,当我在我的客户端/服务器应用程序上工作时,我会在桌面上安装Mac和PC,并且每次都在它们之间切换,这并不奇怪。

最后,我想就你没有提出的问题发表评论。由于您的客户端是移动设备,因此您必须预期它不会始终打开(或者始终没有Internet连接),因此请准备好在服务器中安装一些数据库以便能够存储需要发送的消息后来...

我希望这可以帮助你启动。如果您有更具体的问题,我可以更好地说明。顺便说一下,这项工作并不那么容易,但如果你真的喜欢编程,那就很有趣,特别是当你开始得到你的第一个结果时;)

答案 1 :(得分:1)

如果你真的必须使用套接字,请帮自己一个忙,并抓住像AsyncSocket这样的好套接字库。 https://github.com/robbiehanson/CocoaAsyncSocket

但最好还是首先尝试通过http进行操作,只有当你真的必须这样做时才转移到套接字。

答案 2 :(得分:0)

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

  1. NSURLConnection - 用于从主线程进行异步通信。
  2. 使用NSData同步加载,但是从单独的线程加载。
  3. #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];
    

答案 3 :(得分: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对象)。