2012-08-13 5 views
0

기본적으로 내가하고 싶은 것은 내 자바 기술을 향상시키기 위해 채팅 프로그램 (즉석 메신저와 IRC 사이의 프로그램)을 개발하는 것이다.여러 클라이언트가있는 스트림을 처리 하시겠습니까?

하지만 지금까지 1 개의 큰 문제가있었습니다. 두 개 이상의 클라이언트가있는 경우 올바르게 스트림을 설정하는 방법을 알지 못합니다. 클라이언트와 서버 간의 1 : 1 채팅은 쉽게 작동하지만 한두 가지 클라이언트가 동일한 채팅에서 서버와 함께 할 수있는 대상을 모릅니다.

이것은 내가 얻은 것입니다.하지만 서버와의 영구적 인 스트림이기 때문에 매우 유용 할 것입니다.

private void connect() throws IOException { 
     showMessage("Trying to connect \n"); 
     connection = new Socket(InetAddress.getByName(serverIP),27499); 
     showMessage("connected to "+connection.getInetAddress().getHostName()); 

    } 

    private void streams() throws IOException{ 
     output = new ObjectOutputStream(connection.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(connection.getInputStream()); 
     showMessage("\n streams working"); 

    } 

답변

0

하나의 프로그램에서 여러 스트림을 읽으려면 멀티 스레딩을 사용해야합니다. 스트림에서 읽기는 동기이므로 각 스레드에 대해 하나의 스트림에서 읽어야합니다. 멀티 스레딩에 대한 자세한 내용은 java tutorial on threads을 참조하십시오.

0

몇 달 전으로 거슬러 올라갑니다. 기본적으로 클라이언트 서버 당 ServerSocketThread을 사용했습니다. 클라이언트가 연결되면 해당 포트의 입력 및 출력 스트림을 고정 풀에 등록하고 입력이 전송 될 때까지 차단합니다. 그 다음에 입력을 다른 클라이언트 각각에 복사하여 보냅니다. 서버 코드 :

import java.io.*; 
    import java.net.ServerSocket; 
    import java.net.Socket; 
    import java.util.ArrayList; 

    public class ChatServer { 

     static int PORT_NUMBER = 2012; 

     public static void main(String[] args) throws IOException { 


      while (true) { 
       try (ServerSocket ss = new ServerSocket(PORT_NUMBER)) { 
        System.out.println("Server waiting @" + ss.getInetAddress()); 
        Socket s = ss.accept(); 
        System.out.println("connection from:" + s.getInetAddress()); 

        new Worker(s).start(); 
       } 
      } 

     } 

     static class Worker extends Thread { 

      final static ArrayList<PrintStream> os = new ArrayList(10); 
      Socket clientSocket; 
      BufferedReader fromClient; 

      public Worker(Socket clientSocket) throws IOException { 
       this.clientSocket = clientSocket; 
       PrintStream toClient=new PrintStream(new BufferedOutputStream(this.clientSocket.getOutputStream())); 
       toClient.println("connected to server"); 
       os.add(toClient); 
       fromClient = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 

      } 
      @Override 
      public void run() { 

       while (true) { 
        try { 
         String message = fromClient.readLine(); 
         synchronized (os) { 


          for (PrintStream toClient : os) { 
           toClient.println(message); 
           toClient.flush(); 
          } 
         } 

        } catch (IOException ex) { 
         //user discnnected 
         try { 
          clientSocket.close(); 
         } catch (IOException ex1) { 

         } 
        } 

       } 
      } 
     } 

} 

클라이언트 코드 : 여기에 명령 줄에서 운영하는 기본 프로그램입니다

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.Socket; 

public class Client { 

    public static void main(String[] args) throws IOException { 

     final BufferedReader fromUser = new BufferedReader(new InputStreamReader(System.in)); 
     PrintStream toUser = System.out; 
     BufferedReader fromServer; 
     final PrintStream toServer; 
     Socket s = null; 

     System.out.println("Server IP Address?"); 


     String host; 
     String port = ""; 


     host = fromUser.readLine(); 

     System.out.println("Server Port Number?"); 

     port = fromUser.readLine(); 

     s = new Socket(host, Integer.valueOf(port)); 

     int read; 
     char[] buffer = new char[1024]; 


     fromServer = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     toServer = new PrintStream(s.getOutputStream()); 
     new Thread() { 

      @Override 
      public void run() { 
       while (true) { 
        try { 
         toServer.println(">>>" + fromUser.readLine()); 

         toServer.flush(); 
        } catch (IOException ex) { 
         System.err.println(ex); 
        } 
       } 
      } 
     }.start(); 
     while (true) { 
      while ((read = fromServer.read(buffer)) != -1) { 
       toUser.print(String.valueOf(buffer, 0, read)); 
      } 
      toUser.flush(); 

     } 
    } 
} 
0

나는 ServerSocket(int port)Socket ServerSocket.accept()으로이 여러 번 수행했습니다. 이것은 채팅 서버 클라이언트가 듣고 싶어하는 한 포트를 듣게함으로써 매우 간단해질 수 있습니다. 주 스레드는 다음 클라이언트가 연결될 때까지 대기 한 다음 Socket 객체를 특정 클라이언트로 반환합니다. 일반적으로 n 개의 클라이언트를 일반적으로 처리하기 위해 목록에 넣기를 원할 것입니다.

그렇습니다. 각각의 Socket이 다른 스레드에 있는지 확인하려는 것이지만, 프로그래머는 전적으로 귀하에게 달려 있습니다.

클라이언트가 다른 원본 포트, 고유 한 5- 튜플 (SrcIP, SrcPort, DstIP, DstPort, TCP/UDP/UDP)을 사용하기 때문에 서버의 다른 포트로 리디렉션 할 필요가 없습니다. 다른 IP 프로토콜)을 사용하면 한 서버 포트를 다시 사용할 수 있습니다. 따라서 우리 모두 왜 stackoverflow.com 포트 80을 사용하십시오.

해피 코딩.

관련 문제