2016-02-14 324 views
0

這個問題在我看來已經超過了一天了,我找不到它的一個修復程序。我正在用Java編寫一個聊天應用程序。問題是服務器無法發送消息給客戶端,但可以只接收it.Here是我的課:Java客戶端服務器

服務器類:

public class Server implements Runnable { 
static InetAddress address; 
static ArrayList<Integer> clients=new ArrayList<Integer>(); 
static ArrayList<Socket> socs=new ArrayList<>(); 
static String message=""; 
static DataOutputStream toClient; 
static ServerSocket socket; 
static Socket socketNew; 
static boolean running=false; 
public Server(InetAddress address){ 
    this.address=address; 

} 
public static void main(String[] args) throws IOException 
{ 
    socket=new ServerSocket(8000); 
    System.out.println("Server started on port 8000"); 
    running=true; 

    while(true) 
    { 
     socketNew=socket.accept(); 
     socs.add(socketNew); 
     address=socketNew.getInetAddress(); 

     System.out.println("connected to client at address: "+address); 

     Server server=new Server(address); 
     new Thread(server).start(); 


    } 
} 


public void run() { 

    { 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream())); 
     String message=br.readLine(); 
     System.out.println(message); 
     for(Socket s:socs)  //sending the above msg. to all clients 
     { 
      OutputStream os=os = s.getOutputStream(); 
      PrintWriter pw = new PrintWriter(os, true); 
      pw.write(message); 
      pw.flush(); 

     } 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
    } 

    } 
private void message() { 


}  


} 

這裏是我的客戶端類的相關功能:

private void receive_data() 
    { 
     BufferedReader br; 
     try { 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String message=br.readLine(); 
      console(message); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



    } 
private void send_data() { 

    OutputStream os; 
    try { 
     os = socket.getOutputStream(); 
     PrintWriter pw = new PrintWriter(os, true); 
     pw.println(this.name+": "+textField.getText()); 
     pw.flush(); 
     textField.setText(""); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 




} 

而且,服務器停服任何來自客戶端的消息在第一個消息之後。我認爲這個問題可以通過在循環內部將run()方法的內容封裝在服務器類中來消除。但是它會以這種方式拋出異常。對於上述問題的任何解決方案?

+1

是的,你需要用循環把它括起來。請更改它,並在您的問題中包含它拋出的異常(完整堆棧跟蹤)。 – RealSkeptic

+0

這種方法的問題是當我殺死客戶端的窗口時,有很多例外,並且這也是無限的。我嘗試了類似while(running)的方式,其中running最初爲true。如果發現任何異常,我將運行設置爲false。但這樣,其他客戶端也無法發送任何消息到服務器。並且你能幫我解決我的第一個問題嗎?爲什麼客戶端無法從服務器收到任何消息? –

+0

他們可以從其他客戶端接收消息嗎? –

回答

0
public void run() { 
    try { 
     BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream())); 
     String message; 
     PrintWriter out; 

     while ((message = br.readLine()) != null) { 
      for (Socket s : socs) // sending the above msg. to all clients 
      { 
       out = new PrintWriter(s.getOutputStream(), true); 
       out.println(message); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

你走了。經過一個小客戶的測試,我很快寫下了自己,並且很有效。

你絕對應該在你的代碼格式上工作。 (主要是那些沒有理由的範圍括號)。

+0

感謝man.It工作。對格式化部分感到抱歉。這個問題讓我感到非常頭痛,所以我只是貼了它而不關心縮進。 –