SimpleServer2(Soket + Thread)

SimpleServer2(Soket + Thread)

소스코드

package study.socket;

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


/**
 * 여러개의 Client 연결이 가능한 단순한 서버소켓(리스너) 예제
 *
 * ServerSocket.accept()로 Socket Connection이 성립되면
 * 별도의 Thread로 이후 요청을 처리함,
 *
 * 기타 Exception은 고려하지 않은 간단한 예제임
 *
 * exit-server 명령어를 수신하면 서버 종료
 */
public class SimpleServer2 {

	public static void main( String[] args ) throws IOException {
		ServerSocket server = null;
		Socket client = null;

		try {
			// TCP 8080포트에서 리스닝하도록 서버소켓 생성
			server = new ServerSocket( 8080 );

			// Client로부터 들어오는 연결을 Accept하기 위해 대기
			// Accept즉시 별도의 Thread생성 후 다시 Accept하기 위해 대기( 리스닝 )
			while( true ) {
				client = server.accept();
				new Thread( new Processor( client ) ).start();
			}

		} finally {
			client.close();
			server.close();
		}
	}
}



class Processor implements Runnable {

	private Socket client;

	private InputStream inputStream = null;
	private InputStreamReader inputStreamReader = null;
	private BufferedReader bufferedReader = null;

	private OutputStream outputStream = null;
	private OutputStreamWriter outputStreamWriter = null;
	private BufferedWriter bufferedWriter = null;


	public Processor( Socket client ) {
		this.client = client;
	}


	// 입력 스트림으로 부터 Data를 읽는 메소드
	private String receiveData( BufferedReader bufferedReader ) throws IOException {
		char[] data = new char[ 1024 ];
		bufferedReader.read( data );
		return String.valueOf( data ).trim();
	}


	// 출력 스트림으로 Data를 쓰는 메소드
	private void sendData( BufferedWriter bufferedWriter, String data ) throws IOException {
		bufferedWriter.write( data );
		bufferedWriter.flush();
	}


	@Override
	public void run() {
		try {
			// Client Socket으로 부터 InputStream을 얻는다.
			this.inputStream = this.client.getInputStream();
			this.inputStreamReader = new InputStreamReader( this.inputStream );
			this.bufferedReader = new BufferedReader( this.inputStreamReader );

			// Client Socket으로 부터 OutputStream을 얻는다.
			this.outputStream = this.client.getOutputStream();
			this.outputStreamWriter = new OutputStreamWriter( this.outputStream );
			this.bufferedWriter = new BufferedWriter( this.outputStreamWriter );

			// exit 문자열이 전송되기 전까지 받는 문자열에 대한 ACK를 송신하며,
			// 받은 문자열의 길이를 함께 송신한다.
			String data = null;
			while( true ) {
				data = this.receiveData( this.bufferedReader );

				if( "exit".equalsIgnoreCase( data ) ) {
					this.sendData( this.bufferedWriter, "QUIT" );
					break;
				}

				this.sendData( this.bufferedWriter, "ACK " + data.length() );
			}

		} catch( IOException e ) {
			e.printStackTrace( System.err );

		} finally {
			//@formatter:off
			try { this.bufferedReader.close();     } catch( IOException e ) { /* Swallow exception */ }
			try { this.inputStreamReader.close();  } catch( IOException e ) { /* Swallow exception */ }
			try { this.inputStream.close();        } catch( IOException e ) { /* Swallow exception */ }
			try { this.bufferedWriter.close();     } catch( IOException e ) { /* Swallow exception */ }
			try { this.outputStreamWriter.close(); } catch( IOException e ) { /* Swallow exception */ }
			try { this.outputStream.close();       } catch( IOException e ) { /* Swallow exception */ }
			//@formatter:on

		}

	}

}

Written with StackEdit.