2011-08-12 15 views
9

私は、フォルダを監視し、ファイルが追加されるときにそれらを操作し、何が起こっているのかを簡単に確認できる簡単なプログラムを作成しました。このフォルダは、NSDictionary内の情報をNSNotificationCenterを介して進捗ビューに渡すNSOperationのサブクラスを介して監視されます。Cocoaでサーバー/クライアントアプリケーションを構築する

これで、サーバー上で監視されているフォルダー/処理部分を実行し、複数のワークステーションからの進行状況を監視するクライアントを構築する必要があります。私の問題は、これを達成する方法がわからず、検索が本当に私を助けてくれないということです。

私は、デートされた解決策(WebObjects、Portable Distributed Objects)や不完全な情報をたくさん得ているようです。 NSStreamを使用してデータを前後に渡したいと思うようですが、IPアドレスを探しているので、NSStreamで見つけられるものはクライアント側に設定されているようです。サーバーとそれに接続するクライアントの両方を設定する最善の方法は何でしょうか?

答えて

6

TCPのようなものをお勧めします。 BSD(Mac OS XとiPhoneはどちらもBSD)用のこのソフトウェアを書いているので、BSD Cソケット、またはObjective-Cラッパーを使用することができます。クライアントの良いライブラリの1つはCocoaAsyncSocketです。私は個人的には、SocketKitと呼ばれるTCPネットワーキング用の軽量のObjective-Cソケットクラスを作成しました。このライブラリの使い方は次のようなものです:

// open a connection 
SKTCPSocket * socket = [[SKTCPSocket alloc] initWithRemoteHost:@"SERVER_IP" port:SERVER_PORT]; 
// write data 
[socket writeData:someData]; 
// read data 
NSData * someData = [socket readData:4]; 
// close the socket 
[socket close]; 
[socket release]; 

をサーバーの観点から、あなたはSKTCPSocketServerクラスを使用してポートをリッスンすることができます:TCPソケットを使用してもちろん

SKTCPSocket * aSocket = nil; 
SKTCPSocketServer * server = [[SKTCPSocketServer alloc] initListeningOnPort:1337]; 
@try { 
    [server listen]; 
    while ((aSocket = (SKTCPSocket *)[server acceptConnection]) != nil) { 
     // do something with aSocket 
     [aSocket close]; 
    } 
} @catch (NSException * e) { 
    NSLog(@"Exception : %@", e); 
} 
[server stopServer]; 
[server release]; 

は、独自のネットワークプロトコルを書く意味します。簡単な例は、4バイトの長さのフィールドと、それに続くNSDictionaryのデータ、またはその性質のものを送信することです。これにより、非常に基本的な分散オブジェクトシステムに似た何かを達成することができます。

+0

最後の数日間、この質問を死に任せているわけではありません。忙しいばかりで、このプロジェクトに戻っていない。情報をありがとう私はCocoaAsyncSocketとSocketKitの両方を見ていきますが、これは私が探しているようです。 – Kris

+0

CocoaAsyncSocketは私が必要としていたことが判明しました。イベントが発生したときに接続されたソケットにデータを書き込むのに少し問題があります...しかし、今は接続時に最初に読み込みをしていますので、ドキュメントに記載されていないものがあると確信しています。再度、感謝します! – Kris

4

ゼロコンフィギュレーションネットワーキングのためにBonjourを見てみませんか?(つまり、あなたのサーバーのIPアドレスを見つける必要はありません)

BonjourはWindowsとiOS(iPhone/iPad)でもサポートされているため、アプリケーションを複数のプラットフォーム(WindowsとMacクライアント、またはその逆のサーバー)にしたり、iPhoneをクライアントサーバー(あなたのケースではこれが意味をなさないかどうかわかりませんが、私はちょうど提案しています)。

0

残念ながら、これはココアがかなり弱い場所です。 WebObjectsについて忘れて(Appleが持っている)おそらく分散オブジェクトを忘れるべきです。実際にMacにはクライアント/サーバーソリューションが組み込まれていません。 iOSにはまともなピアツーピアの機能がありますが、依然としてクライアント/サーバーにとっては無用です。

単純なREST APIを使用することをお勧めします。 cocoahttpserverでサーバーを構築します。 NSURLConnectionまたはASIHTTPRequestでクライアントを構築します。単純にする。私はプロトコルのJSONが好きです。 YAJLは私にとってはうまくいっていますが、本当にシンプルなものはたくさんあります。

関連する問題