네트워크: socket_Thread활용

·2022년 11월 9일
0

송수신 스레드를 만들어서 채팅기능을 넣을 수 있음

  • 필요한 클래스 : Server클래스(송/수신클래스), Client클래스(송/수신클래스)
  • 수신 스레드 -> InputStream

1. 큰 틀

Server 클래스

  • 수신 스레드
    class ServerRecThread extends Thread{
    	private Socket socket;
    	public ServerRecThread(Socket socket) {
    		this.socket=socket;
    	}
    	@Override
        public void run(){
        }
    }
  • 송신 스레드
    class ServerSendThread extends Thread{
    	private Socket socket;
    	public ServerSendThread(Socket socket) {
    		this.socket=socket;
    	}
    	@Override
        public void run(){
        }
    }
  • 메인 메소드(서버 실행)
    public class Server1 {
    	public static void main(String[] args) {
    		try {
    			//1. 서버 생성
    			ServerSocket server = new ServerSocket(3000);
    			System.out.println("서버 생성 완료");
    			//3.서버에 접근한 클라이언트 불러오기
    			Socket socket = server.accept();
    			System.out.println("서버 접속완료");
    			//수신 스레드 실행
    			new ServerRecThread().start();
    			//송신 스레드 실행
    			new ServerSendThread().start();
    		} catch (Exception e) {
    			System.out.println(e.getMessage());
    		}
    	}
    }

Client 클래스

  • 수신 스레드

    class ClientSendThread extends Thread{
    	private Socket socket;
    	public ClientSendThread(Socket socket) {
    		this.socket=socket;
    	}
    	@Override
    	public void run() {
    	}
    }
  • 송신 스레드

    class ClientRecThread extends Thread{
    	private Socket socket;
    	public ClientSendRecThread(Socket socket) {
    		this.socket=socket;
    	}
    	@Override
        public void run(){
        }
    }
  • 메인 메소드(서버 실행)

    public class Client1 {
    	public static void main(String[] args) {
    		//2.서버접근 클라이언트
    		try {
    			Socket socket = new Socket("127.0.0.1",3000);
    			System.out.println("서버 접속 완료");
    			//송신 스레드 실행
    			new ClientSendThread().start();
    			//수신 스레드 실행
    			new ClientRecThread().start();
    		} catch (Exception e) {
    			System.out.println(e.getMessage());
    		}
    	}
    }

2. 구현부 작성

Server 클래스

//수신 스레드
class ServerSendThread extends Thread{
	private Socket socket;
	public ServerSendThread(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while(true) {
				String msg = br.readLine();
				if(msg==null) {
					System.out.println("상대방이 대화를 나갔습니다.");
					System.out.println("대화가 종료되었습니다.");
					break;
				}
				System.out.println("클라이언트>>"+msg);
			}
			br.close();
			socket.close();
			System.exit(0);
		}catch(IOException e) {
			System.out.println(e.getMessage());
		}
	}
}
//송신 스레드
class ServerRecThread extends Thread{
	private Socket socket;
	public ServerRecThread(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			Scanner sc = new Scanner(System.in);
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			while(true) {
				String msg = sc.nextLine();
				if(msg.equals("0")) {
					System.out.println("대화를 종료합니다.");
					break;
				}
				pw.println(msg);
				pw.flush();
			}
			pw.close();
			socket.close();
			System.exit(0);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}
}
public class Server1 {
	public static void main(String[] args) {
		try {
			//1. 서버 생성
			ServerSocket server = new ServerSocket(3000);
			System.out.println("서버 생성 완료");
			//3.서버에 접근한 클라이언트 불러오기
			Socket socket = server.accept();
			System.out.println("클라이언트가 접속했습니다. 대화를 시작하십시오.");
			//수신 스레드 실행
			new ServerRecThread(socket).start();
			//송신 스레드 실행
			new ServerSendThread(socket).start();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

Client 클래스

class ClientRecThread extends Thread{
	private Socket socket;
	public ClientRecThread(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			Scanner sc = new Scanner(System.in);
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			//입력문장 소캣으로 보내기
			while(true) {
				String msg = sc.nextLine();
				if(msg.equals("0")) {
					System.out.println("대화가 종료되었습니다.");
					break;
				}
				pw.println(msg);
				pw.flush();
			}
			pw.close();
			socket.close();
			System.exit(0);
		}catch(Exception e) {
			System.out.println(e.getMessage());
		}
	}
}
//수신 스레드
class ClientSendThread extends Thread{
	private Socket socket;
	public ClientSendThread(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		try {
			//읽어오기 기능
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while(true) {
				String msg = br.readLine();
				if(msg==null) {
					System.out.println("상대방이 대화를 나갔습니다.");
					System.out.println("대화를 종료합니다.");
					break;
				}
				System.out.println("서버>>"+msg);
			}
			br.close();
			socket.close();
			System.exit(0);
		}catch(Exception e) {
			System.out.println(e.getMessage());
		}
	}
}
public class Client1 {
	public static void main(String[] args) {
		//2.서버접근 클라이언트
		try {
			Socket socket = new Socket("127.0.0.1",3000);
			System.out.println("서버 접속 완료. 대화를 시작하십시오.");
			//송신 스레드 실행
			new ClientSendThread(socket).start();
			//수신 스레드 실행
			new ClientRecThread(socket).start();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

코드설명

수신 스레드

public void run() {
		try {
			//1->2바이트로 읽어오기(소캣으로부터 읽어옴=>socket.getInputStream())
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //대화는 계속 해야 하니까 반복문으로 감싸줌
			while(true) {
            //소캣으로 받아온 메시지 읽어오기
				String msg = br.readLine();
                //메시지가 null값이 될 때까지 읽어오겠다는 조건. null이 되면 반복문을 빠져나간다.
				if(msg==null) {
					System.out.println("상대방이 대화를 나갔습니다.");
					System.out.println("대화를 종료합니다.");
					break;
				}
                //화면에 출력
				System.out.println("서버>>"+msg);
			}
            //break로 빠져나오면 닫아주고 프로그램 종료시킴
			br.close();
			socket.close();
			System.exit(0);
		}catch(Exception e) {
			System.out.println(e.getMessage());
		}
	}

송신 스레드

	public void run() {
		try {
        	//대화 입력할거니까 scanner 임포트
			Scanner sc = new Scanner(System.in);
            //1->2바이트로 출력(소캣을 통해서 상대방에게 보낸다.)
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			//입력문장 소캣으로 보내기. 대화는 일회성이 아니기때문에 while문으로 감싸줌.
			while(true) {
            //메시지 입력. 0을 입력할때까지 대화한다.
				String msg = sc.nextLine();
				if(msg.equals("0")) {
					System.out.println("대화가 종료되었습니다.");
					break;
				}
                //메시지 출력
				pw.println(msg);
				pw.flush();
			}
            //break로 빠져나오면 닫아주고 프로그램을 종료시킨다.
			pw.close();
			socket.close();
			System.exit(0);
		}catch(Exception e) {
			System.out.println(e.getMessage());
		}
	}
profile
웹개발입문자

0개의 댓글