서버와 클라이언트가 멀티스레드를 바탕으로 순서에 상관없이 자유롭게 대화할 수 있는 채팅 문제입니다 실행순서를 클릭하세요
| 서버 | 클라이언트 |
|
[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Client]님이 들어오실때까지 잠시만 기다려주세요 [Client]님이 들어오셨습니다 [Client]안녕하세요 반갑습니다 [Client]님이 나가셨습니다 quit [Server]님이 나가셨습니다 |
[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요 [Server]님이 들어오셨습니다 안녕하세요 [Server]반갑습니다 quit [Client]님이 나가셨습니다 |
E001 // 클라이언트에서 연결 요청하면 서버는 네트워크 연결 초기화E002 // 서버 데이터가 도착할 때까지 계속 대기E003 // (수신전용스레드와 별개로) 메인 스레드 N41 이후 실행중E004 // 대화를 입력할 때까지 계속 대기E005 // '안녕하세요' 입력E006 // 서버에서 보낸 데이터([Server]반갑습니다) 도착E007 // 'quit' 입력E008 // 서버에서 보낸 데이터([Client]quit) 도착E009 // 메인스레드와 수신전용스레드가 모두 종료하여 프로그램 종료import chat.ChatNetwork;public class MultiThreadChatClient{1 public static void main(String[] args) {2 new ChatNetwork( "localhost" );3 }}package chat;import java.util.Scanner;import network.Network;public class ChatNetwork implements Runnable{private Network network;CN1b public ChatNetwork() {System.out.println( "[Server]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요" );System.out.println( "[Client]님이 들어오실때까지 잠시만 기다려주세요" );CN11 network =CN12 new Network();CN13 network.connectAsServer( this );network.write( "[Server]님이 들어오셨습니다" );CN14 this.write( "[Server]" );CN1e }CN2b public ChatNetwork( String serverIP ) {System.out.println( "[Client]님이 들어오셨습니다. 대화(종료시 quit)를 입력하세요" );CN21 network =CN22 new Network();CN23 network.connectAsClient( serverIP, this );network.write( "[Client]님이 들어오셨습니다" );CN24 this.write( "[Client]" );CN2e }CN3b public void write( String id ) {try {Scanner scan = new Scanner( System.in );CN31 for ( String message = null; ( message =CN32 scan.nextLine() ) != null; ) {if( message.contains( "quit" ) ) {System.out.println( id + "님이 나가셨습니다" );network.write( id + "님이 나가셨습니다" );CN33 network.write( id + message );CN34 break;}CN35 network.write( id + message );CN36 }scan.close();} catch ( Exception e ) {e.printStackTrace();}CN3e }@OverrideCN4b public void run() {CN41 for ( String message = null; ( message =CN42 network.read() ) != null; ) {if( message.contains( "quit" ) ) {System.out.println( message );CN43 network.write( message );CN44 break;}else {CN45 System.out.println( message );}CN46 }CN47 network.close();CN4e }}package network;import java.io.*;import java.net.*;public class Network{public static final int serverPort = 7700;protected ServerSocket serverSocket;protected Socket socket;private BufferedReader in;private PrintWriter out;private Thread waitForCounterpart;N1b public Network() {serverSocket = null;socket = null;in = null;out = null;waitForCounterpart = null;N1e }N2b public void connectAsServer( Runnable obj ) {try {serverSocket = new ServerSocket( serverPort );N21 socket =N22 serverSocket.accept();N23 connectInOut( obj );} catch ( Exception e ) {e.printStackTrace();}N2e }N3b public void connectAsClient( String serverIP, Runnable obj ) {try {N31 socket =N32 new Socket( serverIP, serverPort );N33 connectInOut( obj );} catch ( Exception e ) {e.printStackTrace();}N3e }N4b public void connectInOut( Runnable obj ) {try {in = new BufferedReader( new InputStreamReader( socket.getInputStream() ));out = new PrintWriter( socket.getOutputStream(), true );waitForCounterpart = new Thread( obj );N41 waitForCounterpart.start();} catch ( Exception e ) {e.printStackTrace();}N4e }N5b public String read() {try {if ( this.isConnecting() == true )N51 returnN52 in.readLine();} catch ( Exception e ) {e.printStackTrace();}return null;N5e }N6b public void write( String data ) {try {if ( this.isConnecting() == true )N61 out.println( data );} catch ( Exception e ) {e.printStackTrace();}N6e }public boolean isConnecting() {if ( ( socket != null )&& ( in != null )&& ( out != null )&& ( waitForCounterpart != null )&& ( waitForCounterpart.getState() != Thread.State.TERMINATED ) )return true;elsereturn false;}N7b public void close() {try {if ( waitForCounterpart != null ) {waitForCounterpart.interrupt();waitForCounterpart = null;}if ( in != null ) {in.close();in=null;}if ( out != null ) {out.flush();out.close();out = null;}if ( socket != null ) {socket.close();socket = null;}if ( serverSocket != null ) {serverSocket.close();serverSocket = null;}} catch ( Exception e ) {e.printStackTrace();}N7e }}