2

別の問題があります。

これは私のクライアントの一部です:

Socket socket = new Socket("127.0.0.1", 3000);
            OutputStream out = socket.getOutputStream();

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutput oo = null;
            try {
              oo = new ObjectOutputStream(bos);   
              oo.writeObject(mp3dataStrings);
              byte[] serializedMP3 = bos.toByteArray();
              out.write(serializedMP3);
                out.flush();
            } finally {
              oo.close();
              bos.close();
            }   

これは私のサーバーの一部です:

ServerSocket clientConnect = new ServerSocket(port);
        System.out.println("SimpleServer running on port" + port);
        Socket clientSock = clientConnect.accept();
        InputStream is = clientSock.getInputStream();

        byte[] buffer = new byte[1024];

        for (int i = 0; i < buffer.length; i++) {
          int b = is.read();
          buffer[i] = (byte) b;
          if (b == -1 | b == 0) break;
        }
        ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(buffer));
        String[][] songs = (String[][]) stream.readObject();
        stream.close();

オブジェクト (String[][]) を送信すると、無効なストリーム ヘッダーの例外 ACED0000 が発生します。

これが何を意味し、何をしなければならないのかわかりません。

アレックスに挨拶

4

2 に答える 2

4

あなたはそれをあなたが必要とするよりはるかに複雑にしました。

Socket socket = new Socket("127.0.0.1", 3000);
try {
  ObjectOutputStream oo = new ObjectOutputStream(socket.getOutputStream());   
  oo.writeObject(mp3dataStrings);
  oo.close();
} finally {
  socket.close();
}   

ServerSocket clientConnect = new ServerSocket(port);
System.out.println("SimpleServer running on port" + port);

Socket clientSock = clientConnect.accept();
try {
  ObjectInputStream stream = new ObjectInputStream(clientSock.getInputStream());
  String[][] songs = (String[][]) stream.readObject();
} finally {
  clientSock.close();
}
于 2013-01-02T16:40:55.067 に答える
0

Peter Lawrey の回答に同意しますが、元のコードの問題は、バイト バッファーの人口コードの終了条件に起因します。

    byte[] buffer = new byte[1024];

    for (int i = 0; i < buffer.length; i++) {
      int b = is.read();
      // THIS ARE PROBLEM LINES
      buffer[i] = (byte) b;
      if (b == -1 | b == 0) break;
    }
    ObjectInputStream stream = 
      new ObjectInputStream(new ByteArrayInputStream(buffer));

End-Of-Stream 状態を検出した場合にのみ、このループを終了する必要があります。b==0つまり、これは ObjectInputStream の有効な部分であるため、決して考慮しないでください。

次に、ブレーク条件をチェックする前にバイトをバッファに割り当てないでください。

第 3 に、ByteArrayInputStream を初期化する場合は、バッファ全体ではなく、入力を含むバイト数のみを渡す必要があります。

修正されたブロックは次のようになります。

// How do you know if 1024 is enough to get all data?
// For the sake of this example, assume it's enough
byte[] buffer = new byte[1024];

int count = 0;
for (; count < buffer.length; count++) {
  int b = is.read();

  if ( b == -1 )
  {
    // exit only on End-Of-Stream, and do not record
    // this result into the buffer
    break;
  }

  buffer[count] = (byte) b;
}

ObjectInputStream stream = 
  new ObjectInputStream( 
    // Note, that we are now passing the number of 'active' bytes in the buffer
    new ByteArrayInputStream(buffer, 0, count)
  );
于 2013-01-02T16:53:04.867 に答える