소스코드
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.