본문 바로가기

IT일반과목/java

자바 네트워크 다중접속 과제




=======================================================================


package jongkyu.chat.homework;


import java.io.IOException;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;


public class ClientClass5 {



public void main() {

Scanner sc = new Scanner(System.in);   

System.out.print("이름을 입력해 주세요 : ");//처음에 이름을 보내기 위해서이다.

String name = sc.next();

System.out.print("ip를 입력하세요 : ");

String ip = sc.next();

try{

String ServerIP = ip;

Socket socket = new Socket(ServerIP, 7777); //소켓 객체 생성         

System.out.println("서버와 연결이 되었습니다......");

//사용자로부터 얻은 문자열을 서버로 전송해주는 역할을 하는 쓰레드.

Thread sender = new SendServer(socket, name);            

//서버에서 보내는 메시지를 사용자의 콘솔에 출력하는 쓰레드.

Thread receiver = new ReceiveServer(socket);        

System.out.println("채팅방에 입장하였습니다.");


sender.start(); //스레드 시동

receiver.start(); //스레드 시동


}catch(UnknownHostException e) {

//e.printStackTrace();

}catch (IOException e) {

//e.printStackTrace();

}catch(Exception e){

System.out.println(e);

}

}

}





----------------------------------------------------------------------------------------------------------------------------



package jongkyu.chat.homework;


import java.io.DataInputStream;

import java.net.Socket;


//서버로부터 메시지를 읽는 클래스

public class ReceiveServer extends Thread{

 

  Socket socket;

  DataInputStream in;

 

  //Socket을 매개변수로 받는 생성자.

  public ReceiveServer(Socket socket){

      this.socket = socket;

     

      try{

          in = new DataInputStream(this.socket.getInputStream());

      }catch(Exception e){

          System.out.println("예외:"+e);

      }

  }//생성자 --------------------

 

  @Override

  public void run(){ //run()메소드 재정의

     

      while(in!=null){ //입력스트림이 null이 아니면..반복

          try{

              System.out.println(in.readUTF());

              //서버로부터 읽어온 데이터를 콘솔에 출력

             

          }catch(Exception e){

              System.out.println("예외:"+e);

          }

      }//while----

  }//run()------

}//class Receiver -------



-----------------------------------------------------------------------------------



package jongkyu.chat.homework;


import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import java.util.Scanner;


//서버로 메시지를 전송하는 클래스 

public class SendServer extends Thread {

  Socket socket;

  DataOutputStream out;

  String name;

 

  //생성자 ( 매개변수로 소켓과 사용자 이름 받습니다. )

  public SendServer(Socket socket, String name){ //소켓과 사용자 이름을 받는다.

      this.socket = socket;      

      try{

          out = new DataOutputStream(this.socket.getOutputStream());

          this.name = name; //받아온 사용자이름을 전역변수에 저장, 다른 메서드인 run()에서 사용하기위함.

      }catch(Exception e){

          System.out.println("예외:"+e);

      }

  }

 

  @Override

  public void run(){ //run()메소드 재정의

     

      Scanner s = new Scanner(System.in);

      //키보드로부터 입력을 받기위한 스캐너 객체 생성

     

      //서버에 입력한 사용자이름을 보내준다.

      try {

          out.writeUTF(name);

      } catch (IOException e) {          

          System.out.println("예외:"+e);

      }      

     

      while(out!=null){ //출력스트림이 null이 아니면..반복

          try { //while문 안에 try-catch문을 사용한 이유는 while문 내부에서 예외가 발생하더라도

                //계속 반복할수있게 하기위해서이다.                   

              out.writeUTF(name+" : "+s.nextLine()); //키보드로부터 입력받은 문자열을 서버로 보낸다.

             

          } catch (IOException e) {

              System.out.println("예외:"+e);

          }

      }//while------

  }//run()------

}//class Sender-------



------------------------------------------------------------------------------------------------------------


package jongkyu.chat.homework;


import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Collections;

import java.util.HashMap;

import java.util.Iterator;


public class ServerClass5 {

    HashMap clientMap;

    ServerSocket serverSocket = null;

    Socket socket = null;

   

    //생성자

    public ServerClass5(){

        clientMap = new HashMap(); //클라이언트의 출력스트림을 저장할 해쉬맵 생성.

        Collections.synchronizedMap(clientMap); //해쉬맵 동기화 설정.

    }//생성자----

   

    public void main(){

        try{

            serverSocket = new ServerSocket(7777); //7777포트를 열었다.

            System.out.println("종규서버가 시작되었습니다");//서버시작을 알렸다.

           

            while(true){ //서버가 실행되는 동안 클라이언트들의 접속을 기다림.

                socket = serverSocket.accept(); //클라이언트가 접속을 했다.

                System.out.println(socket.getInetAddress()+":"+socket.getPort()); //클라이언트 정보 (ip, 포트) 출력

               

                Thread jong = new MultiServerRec(socket); //쓰레드 생성.

                jong.start(); //쓰레드 시작

            }      

           

        }catch(Exception e){

            e.printStackTrace();

        }

    }

   

    //접속된 모든 클라이언트들에게 메시지를 전달.

    public void allsend(String message){

       

        //출력스트림을 순차적으로 얻어와서 해당 메시지를 출력한다.

        Iterator ssend = clientMap.keySet().iterator();

       

        while(ssend.hasNext()){//클라이언트가 보내는 메세지를 하나씩 꺼내온다.

            try{

                DataOutputStream ssendout = (DataOutputStream) clientMap.get(ssend.next());

                ssendout.writeUTF(message);

            }catch(Exception e){

                System.out.println("예외:"+e);

            }

        }

    }//allsend()메소드 끝

   

   


   

    // 클라이언트로부터 읽어온 메시지를 다른 클라이언트(socket)에 보내는 역할을 하는 메서드

    class MultiServerRec extends Thread {

       

        Socket socket;

        DataInputStream in;

        DataOutputStream out;

       

        //생성자.

        public MultiServerRec(Socket socket){

            this.socket = socket;

            try{

                //Socket으로부터 입력스트림을 얻는다.

                in = new DataInputStream(socket.getInputStream());

                //Socket으로부터 출력스트림을 얻는다.

                out = new DataOutputStream(socket.getOutputStream());

            }catch(Exception e){

                System.out.println("예외:"+e);

            }

        }//생성자 ------------

       

        @Override

        public void run(){ //쓰레드를 사용하기 위해서 run()메서드 재정의

           

            String name=null; //클라이언트로부터 받은 이름을 저장할 변수.

            try{

                name = in.readUTF(); //클라이언트에서 처음으로 보내는 메시지는

                                     //클라이언트가 사용할 이름이다.

               

                allsend(name + "님이 입장하셨습니다.");//입장한거를 알리기 위해 클라이언트들한테 다 보낸다.

                

                clientMap.put(name, out); //해쉬맵에 키를 name으로 출력스트림 객체를 저장.

                //이거 한 이유는 이름별로 말하는걸 보기 위해서이다.

                System.out.println("현재 접속자 수는 "+clientMap.size()+"명 입니다.");

                //몇명이 접속했는지 알기 위해서 만들었다.

               

                while(in!=null){ //입력스트림이 null이 아니면 반복.

                allsend(in.readUTF()); //현재 소켓에서 읽어온메시지를 해쉬맵에 저장된 모든

                                              //출력스트림으로 보낸다.

                }//while()---------

            }catch(Exception e){

                System.out.println(e + "----> ");

            }finally{

                //예외가 발생할때 퇴장. 해쉬맵에서 해당 데이터 제거.

                //보통 종료하거나 나가면 java.net.SocketException: 예외발생

                clientMap.remove(name);

                allsend(name + "님이 퇴장하셨습니다.");              

                System.out.println("현재 접속자 수는 "+clientMap.size()+"명 입니다.");

            }

        }//run()------------

    }//class MultiServerRec-------------

   

}


---------------------------------------------------------------------------------------------------


package jongkyu.chat.start;


import java.util.Scanner;


import jongkyu.chat.homework.ClientClass5;

import jongkyu.chat.homework.ServerClass5;


public class SumSeCl {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println("종규의 서버클라이언트채팅(다중)");

System.out.println("역할을 선택하세요!!");

System.out.println("1.서버");

System.out.println("2.클라이언트");

int sel = sc.nextInt();

switch(sel) {

case 1 : 

ServerClass5 ms = new ServerClass5(); //서버객체 생성.

ms.main();//실행.

break;


case 2 : ClientClass5 c = new ClientClass5();

c.main();

break;


default : System.out.println("둘중 하나만 입력좀해라");

break;

}

}

}



'IT일반과목 > java' 카테고리의 다른 글

자바 네트워크 TCP통신 문제 맞추기  (0) 2018.08.12
쓰레드2 (학원수업)  (0) 2018.08.10
쓰레드1 (학원수업)  (0) 2018.08.10
네트워크 수업3 (야구게임) (과제)  (0) 2018.08.09
네트워크 수업2  (0) 2018.08.09