2017-04-16 97 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 - 聽起來像是對我的正確方法。 –