JAVA(Sol)(정리대기중..언젠가)

210428_7~8(채팅서버)

너굴셉 2021. 4. 28. 16:59

채팅 프로그램 만들기 (1:1)

 

채팅원리 

서버 <망연결> 클라이언트  
1) 서버소켓      
2) 포트감시 <-------------접속시도-----3) 소켓(서버ip,포트)  
4) 소켓생성
 (클라이언트정보)
     
키보드-->
5) 출력객체-
  [ 버퍼저장 ]
-------------flush-----------> start
- [ 버퍼저장]
====>
Thread ChatHandler run() {
}
6) start
     -
    [ 버퍼저장]
<------------flush----------- 출력객체 - [버퍼저장] <--키보드  

 콘솔출력 버퍼를읽어오고있는중에 클라이언트가 내용을 또 보낼수도있다.

입력개체부분을 스레드(start)로바꾼다.

 

콘솔출력
Thread
Chathandler
run(){
    입력객체 ;
}

IoStream은 simplex이므로, 입력객체와 출력객체를 따로 만들어야 한다.

채팅 프로그램은 서버에서 서버소켓과 포트감시를 제외하면 클라이언트와 동일한 구성을한다.

package chatting;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
	BufferedWriter writer = null;
	Socket socket = null;
	ServerSocket server = null;

	public void serverStart() {
		System.out.println("접속자를 기다리는 중입니다.");
		try {
			server = new ServerSocket(2006); //포트 2006번 감시
			socket = server.accept(); // 접속하면 감시시작
			writer = new BufferedWriter(new OutputStreamWriter
					(socket.getOutputStream())); 
			//멤버변수로 만들었다.
			System.out.println("클라이언트 IP : " + socket.getInetAddress()
			//접속자 출력
			.getHostAddress() + "이름 : "
					+ socket.getInetAddress().getHostName() + "연결되었습니다.");
			//입력객체
			ChatServerHandler handler = new ChatServerHandler(socket);
			handler.start();
			//

			BufferedReader in = new BufferedReader(new InputStreamReader
					(System.in));
			//키보드에 입력되는 내용을 21행writer로 전달
			String s = " ";

			while (true) {
				try {
					System.out.println("=>");
					s = in.readLine(); //키보드에 입력된s라는 매개변수에 넣음
					if(s==null) break;
					if (s.equals("999")) //999면 while을 빠져나온다
						break;
					writer.write(s); //내용
					writer.newLine(); //줄바꿈

					writer.write("---------------------------------");
					writer.newLine(); //줄바꿈
					writer.flush(); //출력

				} catch (Exception e) {
					System.out.println("Err :" + e.toString());
				}
			}
		} catch (IOException ioe) {
			System.out.println("Exception generated...");
		} finally {
			try {
				
				server.close();
			} catch (IOException ignored) {
			}

		}
	}

	public static void main(String[] args) {
		ChatServer cs = new ChatServer();
		cs.serverStart(); //ChatServer cs를 생성해서 실행하라.
	}
}

class ChatServerHandler extends Thread { // Thread를 상속받는 ChatServerHandler
	protected Socket socket;
	String line;

	public ChatServerHandler(Socket socket) {
		this.socket = socket;
	}

	public void run() { //입력받는 run()메소드
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader
					(socket.getInputStream()));
			//socket의 입력스트림을 문자열로 바꾸어 입력버퍼를 받는 reader생성
			while (true) {
				line = reader.readLine(); //한줄씩 읽어와라
				if(line==null) break; //비어있다면 break
				System.out.println("받은글 : " + line);
				System.out.println("=>");
			
				
			}
		} catch (IOException ignored) {

		} finally {
			try {
				
				socket.close();
			} catch (IOException ignored) {
			}
		}
	}
}

//접속자를 기다리는 중입니다.
//클라이언트 IP : 127.0.0.1이름 : 127.0.0.1연결되었습니다.
//=>
//안녕?
//=>
//받은글 : hello?
//=>
//받은글 : ---------------------
//=>
package chatting;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ChatClient {
	BufferedWriter writer = null;
	Socket socket = null;
	String line;
	int cnt = 0;

	public void clientStart(String ip) {
		System.out.println("클라이언트 프로그램 작동...");
		try {
			socket = new Socket(ip, 2006);
			writer = new BufferedWriter(new OutputStreamWriter
					(socket.getOutputStream()));
			//출력객체
			
			
			
//			server = new ServerSocket(2006); //포트 2006번 감시

//			System.out.println("클라이언트 IP : " + socket.getInetAddress()
//			.getHostAddress() + "이름 : "
//					+ socket.getInetAddress().getHostName() + "연결되었습니다.");
			
//			서버와 일부분을 제외하면 완전히 똑같다

			
			
			
			
			ChatClientHandler handler = new ChatClientHandler(socket);
			handler.start();

			BufferedReader in = new BufferedReader(new InputStreamReader
					(System.in));
			String s = " ";

			while (true) {
				try {
					System.out.println("=>");
					s = in.readLine();
					if(s==null) break;
					if (s.equals("999"))
						break;
					writer.write(s);
					writer.newLine();

					writer.write("---------------------");
					writer.newLine();
					writer.flush();
					
				} catch (Exception e) {
					System.out.println("Err :" + e.toString());
				}
			}
		} catch (IOException ioe) {
			System.out.println("Exception generated...");
		} finally {
			try {
				socket.close();
			} catch (IOException ignored) {
			}

		}
	}

	public static void main(String[] args) {
		ChatClient cc = new ChatClient();
		cc.clientStart(args[0]); //chatClient cc를 생성해서 파라미터로 실행하라
	}
}

class ChatClientHandler extends Thread {// Thread를 상속받는 ChatClientHandler
	protected Socket socket;
	String line;

	public ChatClientHandler(Socket socket) {
		this.socket = socket;
	}

	public void run() { //입력받는 run메소드 생성
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader
					(socket.getInputStream()));
			//socket의 입력스트림을 문자열로 바꾸어 입력버퍼를 받는 reader생성
			while (true) {
				line = reader.readLine(); //한줄씩읽어와라
				if(line==null) break; // 비어있다면 break
				
				System.out.println("받은글 : " + line);
				System.out.println("=>");
			}
		} catch (IOException ignored) {

		} finally {
			try {
				
				socket.close();
			} catch (IOException ignored) {
			}
		}
	}
}


//클라이언트 프로그램 작동...
//=>
//받은글 : 안녕?
//=>
//받은글 : ---------------------------------
//=>
//hello?
//=>

 

서버에서 999를 작성하면 서버측 채팅은 먹통이되지만 클라이언트에서 보내는건 가능했다.

클라이언트에서 999를 작성하면 창이 자동으로 창종료됐고, 서버창에 끊임없이 null이 출력됐다

좀 문제있는 예제인듯.. 뭔가 나사빠진듯이 작동한다 나중에 시간나면 고쳐볼것

 

cf) ignored 의미 ㅋㅋ

} catch (SomeException ignored) {

// 변수 이름은 ignored 등으로 바꾸고,

// 예외를 무시하되 관련 로그를 남겨둔다. }