처음부터 시작하는 Java
  • 채팅의 쓰레드화 04번
    2021년 04월 06일 09시 51분 08초에 업로드 된 글입니다.
    작성자: 원2
    728x90
    반응형

    // Thread적용
    package Server;
    
    import java.io.*;
    import java.net.*;
    import java.util.*;
    import Config.Config004;
    
    class Chatting extends Thread {  // Thread의 extends 
    	Socket sObjS;
    
    	Chatting(Socket sObjS) {
    		this.sObjS = sObjS; // 디폴트 생성자가 없으니까 무조건 인자를 넣어줘야한다.
    	}
    
    	public void run() { // run은 한번만 실행된다.
    		try {
    			DataOutputStream dos = new DataOutputStream(sObjS.getOutputStream());
    			DataInputStream dis = new DataInputStream(sObjS.getInputStream());
    			Scanner aScanner = new Scanner(System.in);
    			String sMessage;
    			
    			while (true) { // 대화
    				System.out.print("전송할 메시지 : ");
    				sMessage = aScanner.nextLine();
    				dos.writeUTF(sMessage);
    				System.out.println(Config004.getTime() + "데이터를 전송했습니다.");
    				System.out.println("클라이언로부터 받은 메시지 :" + dis.readUTF());
    				if (sMessage.equals("EXIT")) {
    					break;
    				}
    			}
    
    			dos.close();
    			dis.close();
    			sObjS.close();
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    public class Server004 {
    	public static void main(String args[]) {
    		ServerSocket serverSocket = null;
    
    		try {
    			serverSocket = new ServerSocket(Config004.Port);
    			System.out.println(Config004.getTime() + "서버가 준비되었습니다.");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		while (true) {
    			try {
    				System.out.println(Config004.getTime() + "연결요청을 기다립니다.");
    				Socket socket = serverSocket.accept();
    				System.out.println(Config004.getTime() + socket.getInetAddress() 
    															+ "로부터 연결요청이 들어왔습니다.");
    
    				Chatting aChatting = new Chatting(socket); // Thread 객체 생성
    				System.out.println("서버 Thread 시작...");
    				aChatting.start(); // 채팅 시작
    				System.out.println("서버 Thread Runnig...");
    				aChatting.join(); //  채팅 끝  | 예외만 처리해준다. InterruptedException e
    				System.out.println("서버 Thread 종료...");
    				
    			} catch (IOException | InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    

    package Client;
    
    import java.io.*;
    import java.net.*;
    import java.util.Scanner;
    
    import Config.Config004;
    
    public class Client004 {
    	public static void main(String args[]) {
    		try {
    			System.out.println("서버에 연결중입니다. 서버IP :" + Config004.ServerIP);
    			Socket socket = new Socket(Config004.ServerIP, Config004.Port);
    
    			DataInputStream dis = new DataInputStream(socket.getInputStream());
    			DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    			Scanner aScanner = new Scanner(System.in);
    			String sMessage;
    			
    			while(true) {
    				sMessage = dis.readUTF();
    				System.out.println("서버로부터 받은 메시지 :" + sMessage);
    				System.out.print("전송할 메시지 : ");
    				dos.writeUTF(aScanner.nextLine());
    				System.out.println(Config004.getTime()+"데이터를 전송했습니다.");
    				if(sMessage.equals("EXIT")) {
    					break;
    				}
    			}
    			
    			System.out.println("연결을 종료합니다.");
    
    			dis.close();
    			dos.close();
    			socket.close();
    			System.out.println("연결이 종료되었습니다.");
    		} catch(ConnectException ce) {
    			ce.printStackTrace();
    		} catch(IOException ie) {
    			ie.printStackTrace();
    		} catch(Exception e) {
    			e.printStackTrace();  
    		}  
    	}
    }
    

    package Config;
    
    import java.util.Date;
    import java.text.SimpleDateFormat;
    
    public interface Config004 {
    	public static final String ServerIP = "10.100.104.76";
    	public static final int    Port 	= 7777;
    	
    	public static String getTime() {
    		SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");
    		return f.format(new Date());
    	}
    }
    

    쓰레드화 : 종료하면 다시 연결요청을 기다리는 쓰레드 문 서버는 계속 열려있음.

    728x90
    반응형

    'Language > Java' 카테고리의 다른 글

    210407  (0) 2021.04.07
    Book Manager System Program 최종  (0) 2021.04.07
    Book Manager System Program  (0) 2021.04.06
    전이중방식 채팅  (0) 2021.04.06
    패키지로 묶어서 소켓 돌리기  (0) 2021.04.05
    TCP Socket프로그래밍  (0) 2021.04.05
    댓글