最初のスタックオーバーフローの質問! 探しました...約束します。私は自分の苦境に対する答えを見つけていません。私は...控えめに言っても深刻な問題を抱えています。簡単に言うと、モバイル アプリケーション (Android アプリと iOS アプリ) がソケットを使用してサーバーと通信し、データをデータベースに送信するゲームのインフラストラクチャを開発しています。バックエンド サーバー スクリプト (私は BES またはバック エンド サーバーと呼んでいます) は、数千行のコードです。基本的に、ソケットへの着信接続を受け入れてフォークする main メソッドと、ソケットから入力を読み取り、それをどう処理するかを決定するメソッドがあります。ほとんどのコードは、データベースとの間でデータを送受信し、それをモバイル アプリに送り返すメソッドにあります。私が追加した最新の方法を除いて、それらはすべて正常に機能します。このメソッドは、データベースから大量のデータを取得し、JSON オブジェクトとしてエンコードしてモバイル アプリに送り返します。モバイル アプリは、JSON オブジェクトからデータをデコードし、必要な処理を行います。私の問題は、このデータが非常に大きく、ほとんどの場合、1 回のデータ書き込みでソケットを通過できないことです。したがって、受信しようとしている JSON オブジェクトのサイズをアプリに通知する 1 つのデータ書き込みをソケットに追加しました。ただし、この書き込みが発生した後、次の書き込みで空のデータがモバイル アプリに送信されます。受信しようとしている JSON オブジェクトのサイズをアプリに通知する 1 つのデータ書き込みをソケットに追加しました。ただし、この書き込みが発生した後、次の書き込みで空のデータがモバイル アプリに送信されます。受信しようとしている JSON オブジェクトのサイズをアプリに通知する 1 つのデータ書き込みをソケットに追加しました。ただし、この書き込みが発生した後、次の書き込みで空のデータがモバイル アプリに送信されます。
奇妙なことに、JSON オブジェクトのサイズを送信するこの最初の書き込みを削除すると、JSON オブジェクトの実際の送信は正常に機能します。それは非常に信頼性が低く、一度の読み取りですべてが送信されることを願っています. 状況にさらに奇妙な点を加えると、2 回目の書き込みで送信されるデータのサイズを膨大な数にすると、iOS アプリはそれを適切に読み取りますが、それ以外の場合は空の配列の真ん中にデータが格納されます。
世界で何が起こっているのですか?どんな洞察も大歓迎です!以下は、サーバー側での 2 つの書き込みコマンドの基本的な抜粋です。
このスクリプトの他のどこでも読み取りと書き込みは正常に機能することに注意してください。ただし、2 つの書き込み操作を続けて行うのはこの場所だけです。
サーバー スクリプトは、バークレー ソケットを使用するネイティブ C の Ubuntu サーバー上にあり、iOS は AsyncSocket というラッパー クラスを使用しています。
int n;
//outputMessage contains a string that tells the mobile app how long the next message
//(returnData) will be
n = write(sock, outputMessage, sizeof(outputMessage));
if(n < 0)
//error handling is here
//returnData is a JSON encoded string (well, char[] to be exact, this is native-C)
n = write(sock, returnData, sizeof(returnData));
if(n < 0)
//error handling is here
モバイル アプリは 2 つの読み取り呼び出しを行い、outputMessage
問題なく動作しますが、非常に大きな数returnData
に上書きしない限り、常に空のデータの集まりにすぎませんsizeof(returnData)
。その場合、iOS は空のデータの途中でデータを受信します。オブジェクト (正確には NSData オブジェクト)。AsyncSocket クラスの iOS 側で使用するメソッドは、最初の書き込み呼び出しから受け取った長さまでデータを読み取ることに注意することも重要です。したがって、たとえば 10000 バイトを読み取るように指示すると、そのサイズの NSData オブジェクトが作成され、ソケットから読み取るときにバッファーとして使用されます。
どんな助けでも大歓迎です。よろしくお願いします!