iPhone通信使用套接字

我试图使用应用程序通过套接字与Windows通信。 至less,我试图至less弄清楚如何从iPhone创build连接(也许使用iPhone来ping Windows机器?)我不清楚我需要从哪里开始。 一般来说,我对iOS开发很陌生,并且是套接字/networking编程的新手段。 我已经尝试了几个教程,没有得到我很远。 我的目标是:

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

如果可能的话,我想先写/build立客户端,但是到目前为止我已经失去了。 希望SO社区里的好人可以伸出援助之手,指向正确的方向。

提前致谢!

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

对于iPhone,您需要学习如何使用NSStream ,您可以从这里开始: Cocoastream编程指南 。 您将需要一个输出stream和一个inputstream,以便您可以轻松并行地pipe理传出和传入通信。 换句话说,你将从NSInputStream和派生NSOutputStream类的NSOutputStream类中NSStream 。 当您使用stream发送数据时,您将使用uint8_t缓冲区发送原始数据,因此使用JSON数据包不是强制性的; 我个人不喜欢,但取决于你。

在Windows上,我假设你将使用C#,所以你需要学习TcpListener ,它监听你指定的某个IP地址和端口号。 这可以启动你一点: TcpListener类 。 你也需要TcpClient来读取和写入数据stream。

对于高效的服务器,你需要asynchronous工作,而TcpClient有同步和asynchronous的方法。 同样为了更好的function,你可能需要在你的服务器中使用线程,或者使用内置的BackgroundWorker类,这使得事情变得更容易。

我不build议单独编程客户端,然后服务器,我相信他们应该并行,因为它是双向的沟通,如果你尝试,你会看到,你必须在这里工作less,在那里。 如果我告诉你,当我在我的客户端/服务器应用程序上工作时,我的桌面上有一台Mac和一台PC,并且每隔一段时间在它们之间切换,这并不奇怪。

最后,我想就你没有问的事情发表评论。 由于你的客户端是一个移动设备,所以你必须期望它不总是在线(或者没有互联网连接),因此准备在服务器上做一些数据库工作,以便能够存储需要发送的消息后来…

我希望这可以帮助你启动。 如果你有一个更具体的问题,我可能会更好地说明。 顺便说一下,这项工作并不是那么容易,但是如果你真的喜欢编程,尤其是当你开始获得第一个结果的时候,这是非常有趣的)

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

但是最好还是先尝试一下http,只有当你确实需要的时候才移动到socket。

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

  1. NSURLConnection – 用于来自主线程的asynchronous通信。
  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]; 

如果您使用HTTP,如前所述,生活将会更容易。 当你已经拥有一个像HTTP一样广泛和广泛使用的协议的时候,没有什么用处。

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

使用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对象)。