SimpleServer(Socket)

SimpleServer(Socket)

소스코드

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로 이후 요청을 처리해야 하나 ,
 *
 * 이 예제는 단순화 하기 위해 Server:Client가 1:1인 케이스로 가정한다.
 */
public class SimpleServer {

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


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


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

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

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

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

			// Client로부터 들어오는 연결을 Accept하기 위해 대기
			// Blocking I/O 발생
			client = server.accept();

			// Client Socket으로 부터 InputStream을 얻는다.
			inputStream = client.getInputStream();
			inputStreamReader = new InputStreamReader( inputStream );
			bufferedReader = new BufferedReader( inputStreamReader );

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

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

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

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

		} finally {
			bufferedReader.close();
			inputStreamReader.close();
			inputStream.close();

			bufferedWriter.close();
			outputStreamWriter.close();
			outputStream.close();

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

	}

}

Written with StackEdit.