私はクライアントサーバーアプリを作成しましたが、解決方法がわからない問題に直面しています。
これはクライアントです:
try
{
Socket socket = new Socket(ip, port);
ObjectOutputStream ooos = new ObjectOutputStream(socket
.getOutputStream());
SendMessage message = new SendMessage();
message.numDoc = value.numDoc;
message.docFreq = value.docFreq;
message.queryTerms = query;
message.startIndex = startIndex;
message.count = count;
message.multiple = false;
message.ips = null;
message.ports = null;
message.value = true;
message.docFreq = value.docFreq;
message.numDoc = value.numDoc;
ooos.writeObject(message);
ObjectInputStream ois = new ObjectInputStream(socket
.getInputStream());
ComConstants mensajeRecibido;
Object mensajeAux;
String mensa = null;
byte[] by = null;
do
{
mensajeAux = ois.readObject();
if (mensajeAux instanceof ComConstants)
{
System.out.println("Thread by Thread has Search Results");
String test;
ByteArrayOutputStream testo = new ByteArrayOutputStream();
mensajeRecibido = (ComConstants) mensajeAux;
byte[] wag;
testo.write(
mensajeRecibido.fileContent, 0,
mensajeRecibido.okBytes);
wag = testo.toByteArray();
if (by == null) {
by = wag;
}
else {
int size = wag.length;
System.arraycopy(wag, 0, by, 0, size);
}
} else
{
System.err.println("Mensaje no esperado "
+ mensajeAux.getClass().getName());
break;
}
} while (!mensajeRecibido.lastMessage);
//ByteArrayInputStream bs = new ByteArrayInputStream(by.toByteArray()); // bytes es el byte[]
ByteArrayInputStream bs = new ByteArrayInputStream(by);
ObjectInputStream is = new ObjectInputStream(bs);
QueryWithResult[] unObjetoSerializable = (QueryWithResult[])is.readObject();
is.close();
//AQUI TOCARIA METER EL QUICKSORT
XmlConverter xce = new XmlConverter(unObjetoSerializable, startIndex, count);
String serializedd = xce.runConverter();
tempFinal = serializedd;
ois.close();
socket.close();
} catch (Exception e)
{
e.printStackTrace();
}
i++;
}
そしてこれは送信者です:
try
{
QueryWithResult[] outputLine;
Operations op = new Operations();
boolean enviadoUltimo=false;
ComConstants mensaje = new ComConstants();
mensaje.queryTerms = query;
outputLine = op.processInput(query, value);
//String c = new String();
//c = outputLine.toString();
//StringBuffer swa = sw.getBuffer();
ByteArrayOutputStream bs= new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream (bs);
os.writeObject(outputLine);
os.close();
byte[] mybytearray = bs.toByteArray();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mybytearray);
BufferedInputStream bis = new BufferedInputStream(byteArrayInputStream);
int readed = bis.read(mensaje.fileContent,0,4000);
while (readed > -1)
{
mensaje.okBytes = readed;
if (readed < ComConstants.MAX_LENGTH)
{
mensaje.lastMessage = true;
enviadoUltimo=true;
}
else
mensaje.lastMessage = false;
oos.writeObject(mensaje);
if (mensaje.lastMessage)
break;
mensaje = new ComConstants();
mensaje.queryTerms = query;
readed = bis.read(mensaje.fileContent);
}
if (enviadoUltimo==false)
{
mensaje.lastMessage=true;
mensaje.okBytes=0;
oos.writeObject(mensaje);
}
oos.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
そしてこれはエラーログです:
Thread by Thread has Search Results
Java.io.StreamCorruptedException: invalid stream header: 20646520
at Java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at Java.io.ObjectInputStream.<init>(Unknown Source)
at org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.Java:747)
at org.tockit.comunication.ServerThread.run(ServerThread.Java:129)
at Java.lang.Thread.run(Unknown Source)
org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.Java:747)
は、ObjectInputStream is = new ObjectInputStream(bs);
の直後の最初のコードのこの行while (!mensajeRecibido.lastMessage);
です。
何か案は?
値20646520
はASCII @A
にあります。
ObjectInput/OutputStreamsは、ストリームの先頭で「マジック」値を使用して、オブジェクトの特別なシリアル化に準拠していることを示します。 (これは0xCAFEBABE
だったと思いますが、よくわかりません)
これは、ObjectInputStreamがマジックを読み取る前に、何かがすでにストリームを読み取ったか、読み取ったストリームがObjectOutputStreamによって生成されていないことを意味します。
変数by
をwig
(または追加)に割り当てます。これは、mensajeRecipido.fileContent
を使用するため、私が知る限り、ObjectOutputStreamによって生成されないバイト配列です。 。 mensajeRecipido.fileContent
は実際のファイルの内容だと思います。この実行中のインスタンスはObjectOutputStreamと同じ形式ではないため、ストリームヘッダーの例外が発生します。