2017-04-16 36 views
-1

我想创建一个小型应用程序,可以通过套接字发送文本日志。当套接字被接受时,该套接字的输入流将被存储在像这样的HashMap中。如何读取相同的输入流两次,而没有输入流停止工作

private HashMap<Integer,InputStream> allinputsstreams = new 
HashMap<Integer,InputStream>(); 

之后,我将创建一个新的JFrame对于当前的InputStream

public LogListener(int socketid, SocketListener socketlistener, Gui gui) { 
    this.socketid = socketid; 
    this.gui = gui; 
    this.inputstream = socketlistener.getClient(socketid); 
    JFrame frame = new JFrame("Log listener"); 
    frame.setLocationRelativeTo(null); 
    frame.setPreferredSize(new Dimension(framewidth,frameheight)); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    logarea = new JTextArea(); 
    frame.add(logarea); 
    frame.pack(); 
    frame.setVisible(true); 
    frame.addWindowListener(this); 
    listenthread = new Thread(this); 
    listenthread.start(); 
} 

然后我用的InputStream从列表中接收数据,并把它写在JFrame的

public void run() { 
    input = new DataInputStream(inputstream); 
    while(!formclosed) { 
     try { 
      String addtext = input.readUTF(); 
      addtext = formatText(addtext); 
      logarea.setText(logarea.getText() + addtext); 
     } catch (EOFException e) { 
      System.out.println("Looks like the client has been closed."); 
      return; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

这适用于接收1个JFrame上的数据,但是一旦我打开2个JFrames(意思是打开两次相同的输入流),那么没有任何输入流再起作用。我期待至少有1个inputstream仍然可以工作。

+0

你是什么意思“没有输入流工作”?你有例外吗?僵局?还有别的吗? –

+0

我没有得到任何异常,但是当我打开它时发送数据并将其写入JFrame(这是我想要的),但是当我打开另一个(打开输入流两次)时,没有任何输入流发送我需要的数据 – Rvdrichard

+0

不是输入流绑定到单独的套接字吗?你为什么要读两次相同的输入流? –

回答

1

听起来好像您正试图在两个不同的视图中显示来自输入流的数据。你不能真正阅读两次纯InputStream;相反,你需要某种缓冲。因此,而不是试图两次读它,我建议您修改代码以两种方式之一,这两者仅使用每个流的单个读循环包括:

  1. 修改您的读取循环更新内部缓冲区而不是致电logarea.setText(logarea.getText() + addtext);。每当读取循环更新缓冲区时,应通知任何感兴趣的视图(通过您实现的某种观察者模式)内容已更改。

  2. 修改读取循环以更新所有感兴趣的视图,而不是为每个JFrame分别具有读取循环。读循环将需要访问日志区域列表而不是单个logarea。它会遍历整个列表并使用与您现在使用的逻辑logarea相同的逻辑更新每个日志区域。

关键是永远不会有两个读取循环访问相同的输入流。

+0

我想我现在得到它,我会改变我的代码感谢你为你的答案。 – Rvdrichard

+0

太棒了!它为我工作。我正在将流数据写入ByteArrayOutputStream对象并立即关闭输入流和套接字。然后,当我需要数据时,我可以使用它从ByteArrayOutputStream的Object。 纠正我,如果我做错了什么。 –

+0

@KishoreKumarKorada - 听起来像是对我的正确方法。 –