gpt4 book ai didi

java - 在 Java 中发送对象时如何停止从 BufferedReader 读取?

转载 作者:行者123 更新时间:2023-12-01 21:49:59 25 4
gpt4 key购买 nike

我正在编写一个java程序,它通过套接字发送一个转换为字节数组的对象。客户端必须读取所有字节并将其转换回 Java 对象。然而,我的程序卡在循环内的 read() 上,我在其中读取所有字节,直到找到 -1。

我已阅读文档,它说 read() 方法在到达流末尾时返回 -1,但这不起作用。

这是我的代码:发送对象的方法:

Socket socket;
BufferedReader input;
DataOutputStream output;
boolean connectionOpen; //Just for you to know the types of the attributes of my class
public void sendResponse(Object obj) throws IOException{

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
out = new ObjectOutputStream(bos);
out.writeObject(obj);
byte[] yourBytes = bos.toByteArray();


output.write(yourBytes);

} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException ex) {
// ignore close exception
}
try {
bos.close();
} catch (IOException ex) {
// ignore close exception
}
}


}

读取字节的方法。 (这就是我的代码被卡住的地方)

public Email getMail(int id) throws Exception{
byte[] bytes = new byte[50000];
Email result;
try{
this.outToServer.writeBytes("MAIL "+id+"\n");
String response = inFromServer.readLine();
String[] data = response.split(" ");
int code = Integer.parseInt(data[0]);
if(code==500){
throw new Exception("Error en servidor Pop4. Servidor respondio: "+response);
}
int current = inFromServer.read();
int i = 0;

while(current!=-1){

bytes[i]=(byte) current;
i++;
current= inFromServer.read();
}
//Convertimos el arreglo de bytes a un objeto Email
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInput in = null;
try {
in = new ObjectInputStream(bis);
result = (Email) in.readObject();

} finally {
try {
bis.close();
} catch (IOException ex) {
// ignore close exception
}
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
// ignore close exception
ex.printStackTrace();
}
}
}

catch(Exception e){
throw e;
}
return result;


}

最佳答案

我建议您直接从套接字一次读取一个对象。

final ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());

public void sendMessage(Object obj) {
out.writeObject(obj);
out.reset();
out.flush();
}

final ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

public Object readMessage() {
return in.readObject();
}

简而言之,您需要知道何时应该停止阅读或使用可以停止阅读的流。

关于java - 在 Java 中发送对象时如何停止从 BufferedReader 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35375309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com