3

C を使用して Java クライアントから C サーバーに文字列を送信しようとしています。まず、文字列の長さを送信します。次に、C でメモリを手動で割り当て、最後に文字列を 1 文字ずつ送信します。

正しい文字列を取得する場合もあれば、文字列全体 + その他の不明な文字を取得する場合もあります (取得するよりも多くを割り当てているように)。

Javaコードは次のとおりです。

protected void send(String data){
    short dataLength=(short)data.length();
    try {
        out.write(dataLength);
    for (int i=0; i<data.getBytes().length ;i++)
    {
        out.write(data.getBytes()[i]);
    }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

そして、ここにCコードがあります:

void read4(int sock, int *data)
{

    char dataRecv;
    char* memoireAllouee=NULL;
    int stringLength;
    int i=0;
    recv(sock, (char*)&dataRecv, sizeof(dataRecv), 0) ;
    *data = dataRecv;
    stringLength=dataRecv;
    memoireAllouee=malloc(sizeof(char)*stringLength);
    if (memoireAllouee==NULL)
    {
        exit(0);
    }
    for (i=0;i<stringLength;i++)
    {
        recv(sock, (char*)&dataRecv, sizeof(dataRecv), 0) ;
        *data = dataRecv;
        memoireAllouee[i]=dataRecv;
    }
    printf("\n\n%d\n\n\n",stringLength);
    printf("\n%s\n",memoireAllouee);
}

この方法が最適ではないと思われる場合は、より高速な方法で私を助けてもらえますか?

4

2 に答える 2

9
protected void send(String data){
    short dataLength=(short)data.length();
    try {
        out.write(dataLength);
    for (int i=0; i<data.getBytes().length ;i++)
    {
        out.write(data.getBytes()[i]);
    }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

まず、文字ごとに配列getBytes()全体を2 回再計算しています。を変数に保存し、それを使用します。これは、完全に不必要に、二次的な時間を要します。さらに、ループを実行する代わりに、直接呼び出してみませんか?byte[]byteArrayout.write(byteArray)for

第 2 に、data.length()常に と等しいとは限りませんdata.getBytes().length()byteArray.lengthただの代わりに書いていることを確認してくださいdata.length()

最後に、両端で一貫した文字セットを使用していることを確認してください。文字列からバイト配列へのマッピングは に大きく依存しているため、エンコーディングの問題が発生しないように、両側Charsetで同じであることを確認してください。Charset

于 2012-04-23T00:08:48.620 に答える
4

2 番目の質問に答えるには:

for (int i=0; i<data.getBytes().length ;i++)
{
    out.write(data.getBytes()[i]);
}

ちょうどあるべきです:

out.write(data.getBytes());

for (i=0;i<stringLength;i++)
{
    recv(sock, (char*)&dataRecv, sizeof(dataRecv), 0) ;
    *data = dataRecv;
    memoireAllouee[i]=dataRecv;
}

次のようにする必要があります。

int offset= 0;
while (offset < stringLength)
{
    int count = recv(sock, &memoireAllouee[offset], stringLength-offset 0) ;
    if (count == 0)
        // premature EOS .. do something
        break;
    if (count == -1)
        // Error ... do something
        break;
    offset += count;
}
于 2012-04-23T01:37:26.663 に答える