2017-11-06 12 views
0

자바에서 간단한 스레드 서버 클라이언트 메시징 응용 프로그램을 만들고 있습니다. 내 문제는 클라이언트가 열려있을 때 서버가 메시지를 가져 오지만 다른 클라이언트가 아닌 메시지를 보낸 클라이언트에게만 메시지를 다시 보냅니다. 어떻게하면 서버에 연결된 모든 클라이언트로 보낼 수 있습니다.자바 간단한 서버 클라이언트

서버 코드

import java.io.*; 
import java.net.*; 
public class ThreadedSever 
{ 
    private static final int port=5000; 
    //Threaded Server 
    public ThreadedSever(){ 
    System.out.println("A multi-threaded server has started..."); 
    ServerSocket serverSocket = null; 
    try { 
     serverSocket = new ServerSocket(port); 
    }catch(Exception e){ 
     System.out.println("Could not create a server socket: " + e); 
    } 
    //Chat with the client until breaks connection or says bye 
    try{ 
     while(true){ 
      System.out.println("Waiting for client communication"); 
      Socket currentSocket = serverSocket.accept(); 
      //Create a new thread to deal with this connection 
      new ServerThread(currentSocket); 
     } 

    }catch(Exception e){ 
     System.out.println("Fatal Server Error!"); 
    } 
    } 
    //Inner class to handle individual commincation 
    private class ServerThread extends Thread{ 
    private Socket sock; 
    private DataInputStream in = null; 
    private DataOutputStream out = null; 

    public ServerThread(Socket sock){ 
     try{ 
      this.sock = sock; 
      in = new DataInputStream(this.sock.getInputStream()); 
      out = new DataOutputStream(this.sock.getOutputStream()); 
      System.out.print("New client connection established"); 
      out.writeUTF("Type bye to exit, otherwise, prepare to be echoed"); 
      start(); 
     }catch(Exception e){ 
      System.out.println("Oops"); 
     } 
    } 
    public void run(){ 
    try{ 
     String what = new String(""); 
     while(!what.toLowerCase().equals("bye")){ 
      what = in.readUTF(); 
      System.out.println("Client told me: " + what); 
      out.writeUTF(what); 
     } 
    }catch(Exception e){ 
     System.out.println("Connection to current client has been broken"); 
    } 
    finally{ 
     try{ 
      sock.close(); 
     }catch(Exception e){ 
      System.out.println("Error socket could not be closed"); 
     } 
    } 
    } 
    } 
    public static void main(){ 
    new ThreadedSever(); 
    } 
} 

ServerThread의 방법 echoMessage를 정의 할 수 있습니다

import java.io.*; 
import java.net.*; 
public class simpleClient 
{ 
    private static final int port= 5000; 
    private static String server = "localhost"; 
    private static Socket socket = null; 
    private static DataInputStream input = null; 
    private static DataOutputStream output = null; 
    private static InputStreamReader inReader = null; 
    private static BufferedReader stdin = null; 

    public static void main(){ 
     try{ 
      socket = new Socket(server, port); 
     }catch(UnknownHostException e){ 
      System.err.println("Unknow IP address for server"); 
      System.exit(-1); 
     } 
     catch(IOException e){ 
      System.err.println("No server found at specified port"); 
      System.exit(-1); 
     } 
     catch(Exception e){ 
      System.err.println("Something happened!"); 
      System.exit(-1); 
     } 
     try{ 
      input = new DataInputStream(socket.getInputStream()); 
      output = new DataOutputStream(socket.getOutputStream()); 
      inReader = new InputStreamReader(System.in); 
      stdin = new BufferedReader(inReader); 
      String what = new String(""); 
      String response; 
      while(!what.toLowerCase().equals("bye")){ 
       // Expect something from the server and output it when it arrives 
       response = input.readUTF(); 
       System.out.println("Server said \"" + response + "\""); 
       //Read a line from the user and send it to the server 
       what = stdin.readLine(); 
       output.writeUTF(what); 
      } 
     } 
     catch(IOException e){ 
      System.err.println("Broken connection with server"); 
      System.exit(-1); 
     } 

    } 
} 
+1

모든 현재 소켓 출력 스트림의 목록을 유지하고 목록을 반복하여 각 출력 스트림으로 보내야합니다. –

답변

1

클라이언트 코드입니다. ServerThread이 인스턴스화 될 때마다 list에 해당 인스턴스를 ThreadedSever에 추가하십시오. 또한 ServerThreadobserver으로 만들면 ServerThread이 데이터를 수신하면 관찰자 메소드는 ServerThread 목록의 각 요소에서 echoMessage를 호출해야합니다.

+0

모든 도움에 감사드립니다! – jrocc