2012-05-15 102 views
0

我遇到了一個新問題。 我用Java編寫+ Swing的使者,我選擇了這種方式,使客戶的談話服務器:客戶端停止響應服務器的消息

我有類運行(所有的代碼是客戶端) (服務器是好的 - 我選中)

public class Running { 
private Socket s; 
private PrintStream ps; 
private BufferedReader br; 

public Running(){ 
try{ 
    s = new Socket(InetAddress.getLocalHost(), 8072); 
    ps = new PrintStream(s.getOutputStream()); 
    br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
} catch (UnknownHostException ex) { 
    System.out.println("11"); 
    ex.printStackTrace(); 
} catch (IOException ex) { 
    System.out.println("00"); 
    ex.printStackTrace(); 
} 
} 

public String receiveLine(){ 
    String ret = ""; 
    try { 
     ret = br.readLine(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return ret; 
} 

public void sendLine(String s){ 
    ps.println(s); 
} 

public void close(){ 
    try { 
     s.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

而且在主我讓一個變量

run = new Running(); 

然後我到處發這個變量和IT方面樂於工作。它提供了readline或者writeline throwgh套接字。 我可以註冊一個用戶,登錄或添加聯繫人。

我可以打開一個MessageFrame將消息發送給我的聯繫人。 但是當我關閉它時,我的程序停止了對服務器消息的正確反應。 它只對30-70%的消息作出反應。 我檢查 - 服務器是好的。 所以問題在運行或MessageFrameListener

public class MessageFrameListener{ 
private MessageFrame mf; 
private User us; 
private Contact cn; 
private Timer timer; 
private Running run; 

public MessageFrameListener(MessageFrame m_f, User u_s, Contact c_n, Running r_n){ 
    run = r_n; 
    mf = m_f; 
    us = u_s; 
    cn = c_n; 
    m_f.addButtonListener(new SButtonListener()); 
    m_f.addWinListener(new FrameListener()); 
    timer = new Timer(500,new timerListener()); 
    timer.start(); 
} 


public class timerListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
       SwingWorker<String,Void> sw = new SwingWorker<String,Void>(){ 
        public String doInBackground() { 
         String ret = ""; 
         ret = run.receiveLine(); 
         return ret; 
        } 
        public void done() { 
         String[] results = null; 

          try { 
           results = get().split(" "); 
          } catch (InterruptedException 
            | ExecutionException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 


         if("m".equals(results[0])){ 
          if("-1".equals(results[2])) 
           mf.addLine2("Error"); 
          else{ 
           mf.addLine2(results[3]); 
          } 
         } 


        } 
       }; 
       sw.execute(); 
    } 
} 

public class SButtonListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e) { 
      String insert = mf.getInput(); 
      if(!insert.equals("")){ 
       String infoString = "m "+us.getName()+" "+cn.getName()+" "+insert; 
       run.sendLine(infoString); 
       mf.addLine(insert); 
       mf.refreshInput(); 
      } 
    } 
} 


public class FrameListener implements WindowListener{ 

    @Override 
    public void windowClosing(WindowEvent e) { 
     timer.stop(); 
     timer = null; 
     mf.close(); 
    } 

新的信息! 我開始調試了。我的客戶端從服務器獲取消息併到達此線路

mf.addLine2(results[3]); 

但是沒有任何反應! Swing不添加新行。

addLine2的代碼:

public void addLine2(String line){ 
    //dialogArea.append(line+"\n"); 

    try { 
     if(line != ""){ 
      String formLine = us.getName()+" ("+now()+")\n"; 
      doc.insertString(doc.getLength(), formLine+line+"\n",st2); 
     } 

    } 
    catch (BadLocationException e){ 
     e.printStackTrace(); 
    } 

} 

當然行= 「」; 可能是線程的一些Swing問題? Swing無法處理我的請求?

瓦西里。

+2

1)將你的問題分解爲兩個三分開的問題2)在這個論壇上搜索,我可以在這裏找到幾個關於Swing和Socket的代碼和SwingWorker/Runnable#線程 – mKorbel

回答

1

嘿,他在說什麼是對的,該字符串將與/ n結合,但它正在嘗試獲取。

in that just try with **While** condition , that till true get the string . 

這裏是樣品,

try { 
     while(true) { 

      DataInputStream is = new      DataInputStream(sock.getInputStream()); 
      System.out.println("" +is.readLine()); 

      line =is.readLine(); 

     } // end of while 
    } catch(Exception ex) {} 
} 
+0

有關此問題的新有趣信息(來自調試)!看到我的問題的底部 –

1

它可能是因爲readLine方法期望該行以\ n結尾。嘗試讓服務器發送消息並在其末尾輸入\ n

+0

服務器發送消息outputStream.println(「some string」);所以他們似乎以\ n結束,因爲println –

+0

嘗試使用一個類似main的小測試類:for(;;)running.receiveLine()如果不起作用,請查看代碼在客戶端停止的位置 – dosse91214

+0

它不會幫助。我可以在Message Frame的第一次打開時發送2或2000條消息,並且一切正常。但是當我關閉並第二次打開時 - 我只收到50%的消息。 –

2

在我看來,問題在於這條線,你的PrintStream沒有被設置爲自動刷新,因此試圖改變這一行:

ps = new PrintStream(s.getOutputStream()); 

至此

ps = new PrintStream(s.getOutputStream(), true); 

所以不是將輸入存儲到緩衝區,而是將其自動清除。更多信息PrintStream(OutputStream out, boolean autoFlush)

相關問題