송수신 스레드를 만들어서 채팅기능을 넣을 수 있음
- 필요한 클래스 : Server클래스(송/수신클래스), Client클래스(송/수신클래스)
- 수신 스레드 -> InputStream
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()); } } }
수신 스레드
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()); } } }
//수신 스레드 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()); } } }
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());
}
}