2016-02-14 1 views
0

Эта проблема прослушивает меня уже более суток, и я не могу найти исправление для него. Я пишу приложение чата в Java. Проблема в том, что сервер не может отправлять сообщения клиентам, но может получать только it.Here мои классов:Java-клиент 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() в класс сервера внутри while loop.But это бросает исключения таким образом. Все решения этой проблемы?

+1

Да, вам нужно приложить его петлей. Пожалуйста, измените его и включите исключения, которые он выбрасывает (полная трассировка стека) в вашем вопросе. – RealSkeptic

+0

Проблема с этим методом заключается в том, когда я убиваю окно клиента, есть множество исключений, и это тоже бесконечное нет. times.I пробовал что-то вроде while (running), где выполняется изначально true.If любое исключение поймано, я устанавливаю равным 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 работал. И жаль насчет форматирования part.The проблема дала мне так много головной боли, что я только что отправил его, не заботясь о вдавливании. –