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