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

时间:2016-02-13 02:16:04

标签: java

我正在编写一个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;


}

2 个答案:

答案 0 :(得分:2)

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

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();
}

简而言之,您需要知道何时应该停止阅读或使用流式传输。

答案 1 :(得分:1)

文档非常正确,InputStream.read()在无法传输任何字节时返回-1,因为它已到达流的末尾。但是,你所呈现的内容并没有让我有理由认为条件会得到满足。

流结束对应于一种条件,在该条件下,确定将不再从流中接收到更多字节。这与在任何给定时间都没有更多字节可用完全不同。如果发送方确实没有进一步说明连接的剩余生命周期,那么它应该关闭 OutputStream以便连接结束。在它这样做之后,读者应该检测到流末尾。你没有提供证据表明你这样做。

如果发件人尚未准备好关闭流,那么您需要设计一种不同的方式让接收者知道何时停止阅读。这意味着在流的顶部有某种应用层协议。其中一个最简单的协议涉及发送包含固定宽度字节数后跟指定字节数的消息。