import java.io.*; import java.net.*; import java.util.*; class TempoSocket{ private Socket tempoSocket; private PrintWriter pw; public TempoSocket(Socket tempoSocket){ this.tempoSocket=tempoSocket; try{ pw=new PrintWriter(tempoSocket.getOutputStream(), true); }catch(IOException e){} } public void send(String str){ pw.println(str+"\n"); } } class ServerThread extends Thread{ private Socket clntSocket; private BufferedReader br; private Vector clntList; public ServerThread(Socket clntSocket, Vector clntList){ this.clntSocket=clntSocket; this.clntList=clntList; try{ br=new BufferedReader(new InputStreamReader(clntSocket.getInputStream())); }catch(IOException e){} } public void run(){ while(true){ String str=null; try{ str=br.readLine(); }catch(IOException e){} for(int i=0; i<clntList.size(); i++){ TempoSocket tSocket=(TempoSocket)clntList.get(i); tSocket.send(str); } } } } class JavaServer{ public static void main(String[] args){ System.out.println(" Welcome to Chatting Server"); ServerSocket servSocket; Vector clntList; try{ servSocket=new ServerSocket(8088); clntList=new Vector(10); while(true){ Socket tempo=servSocket.accept(); TempoSocket tSocket=new TempoSocket(tempo); clntList.add(tSocket); ServerThread st=new ServerThread(tempo, clntList); st.start(); } }catch(Exception e){} } } |
3가지 클래스로 구분 되어있습니다.
1. TempoSocket 클래스
2. ServerThread 클래스
3. JavaServer 클래스
TempoSocket 클래스는 클라이언트 요청에 의한 socket 생성시 내용을 담기위해 만들었습니다.
* 여러명이 동시 접속하여 채팅 할 경우, 서버가 한 호스트로 부터 받은 내용을 다시 여러 호스트로 뿌려주기
위해서 각각의 클라이언트 소켓의 전송경로 clntSocket.getOutputStream()를 기억하기 위해서..
ServerThread 클래스는 여러 클라이언트 소켓의 동시 진행을 위해서 만들엇습니다. 실시간 채팅에서
이 기능을 구현하지 않으면 아마도 채팅글 입력 순서에 따라 출력 되는게 아니라 프로세스 진행 순서에
따라서 출력되지 않을까 싶습니다.
* 10명이 채팅시 10개의 소켓이 활성화 상태이며, 한 클라이언트가 메세지 전송시 해당 소켓을 인수로 사용하는
BufferedReader 객체가 이를 읽은 후 , 벡터에 저장된 10개의 클라이언트 소켓의 정보를 담은 객체를 이용해서
모두 뿌려줌
JavaServer 클래스는 main메소드가 있고 무한 루프를 돌면서 새로운 클라이언트 접속시 위의 두 과정을 진행 시킴