1

アプリケーションを使用して、ソケットを介してWindowsと通信しようとしています。少なくとも、iPhoneから接続を作成する方法を理解しようとしています(おそらくiPhoneを使用してWindowsマシンにpingを実行しますか?)どこから始めればよいのかよくわかりません。私は一般的にiOS開発にかなり慣れておらず、ソケット/ネットワークプログラミングにまったく慣れていません。私は私を遠くまで得ていないいくつかのチュートリアルを試しました。私の目標は:

  • ソケットを介してサーバーに接続します(サーバーは、iPhoneからの着信接続を待機するサービスを備えたWindowsマシンになります)
  • 最終的にはサーバーにJSONパケットを送信し、サーバーからJSONパケットを受信します
  • 成功または失敗を示すiPhoneでの応答を考え出す

可能であれば、最初にクライアントピースを作成/ビルドしたいのですが、これまでのところ迷っています。うまくいけば、SOコミュニティの素敵な人々が手を貸して、私を正しい方向に向けることができます。

前もって感謝します!

4

4 に答える 4

3

あなたの質問は非常に広く、特に特定のプログラミングの問題を対象としていないということです。いくつかのガイドラインまたは開始点を示します。

iPhoneの場合は、操作方法を学ぶ必要がありNSStreamます。ここから始めることができます:Cocoaのストリームプログラミングガイド。発信通信と着信通信を簡単かつ並行して管理できるように、出力ストリームと入力ストリームが必要になります。言い換えると、メインクラスから派生しNSInputStreamたクラスとクラスの恩恵を受けることができます。ストリームを使用してデータを送信する場合は、バッファーを使用して生データを送信するため、JSONパケットを使用する必要はありません。私は個人的にはしませんが、それはあなた次第です。NSOutputStreamNSStreamuint8_t

Windowsでは、C#を使用することを想定しているためTcpListener、指定した特定のIPアドレスとポート番号でリッスンするものを学習する必要があります。これにより、少し起動する可能性があります:TcpListenerクラス。またTcpClient、ストリームの読み取りと書き込みを行うために必要になります。

効率的なサーバーを使用するには、非同期で作業する必要があり、TcpClientそのための同期メソッドと非同期メソッドがあります。また、機能を向上させるには、サーバーでスレッドを使用するか、組み込みのBackgroundWorkerクラスを使用する必要があります。これにより、作業がはるかに簡単になります。

クライアントだけをプログラミングしてからサーバーをプログラミングすることはお勧めしません。これは両面通信であるため、並行して実行する必要があると思います。試してみると、こことそこではほとんど作業する必要がないことがわかります。クライアント/サーバーアプリで作業しているとき、机の上にMacとPCがあり、それらを時々切り替えると言っても不思議ではありません。

最後に、あなたが質問しなかったことについてコメントしたいと思います。クライアントはモバイルデバイスであるため、常にオンになっているとは限らない(またはインターネット接続が常にオンになっていない)ことを期待する必要があります。したがって、送信する必要のあるメッセージを保存できるように、サーバーでデータベースを機能させる準備をしてください。後で...

これがあなたのスタートアップに役立つことを願っています。より具体的な質問がある場合は、より適切に説明できる可能性があります。ちなみに、この仕事はそれほど簡単ではありませんが、プログラミングが本当に好きなら、特に最初の結果を得始めたときはとても楽しいです;)

于 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、およびRESTAPIを使用して通信する例。

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 に答える