Language/Java

채팅의 쓰레드화 04번

원2 2021. 4. 6. 09:51
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