강좌 & 팁
글 수 2,412
2013.11.22 13:56:00 (*.52.177.249)
40618
제목은 TcpServer만들기로 되어있는데 하다보니 프로토콜 파싱으로 변질되고있네요....^^;
어쨌든 저번 시간에는 한 바이트씩 받아서 처리하는 부분을 만들어 봤고....
이번시간에는 버퍼를 만들어서 한바이트씩 읽는것보다는 좀더 빠르게 처리하도록 하는 방법을 알아보도록
하겠습니다.
소스는 저번걸 계속 우려 먹겠습니다. ^^;
그럼, 소스를 함께 보시죠 어디가 변했는지...
[샘플 소스]
//import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; //import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServer implements Runnable{ private ServerSocket server = null; public TcpServer(int port) { try { System.out.println("server port : "+port); server = new ServerSocket(port); } catch (IOException e) { System.err.println("Server Socket Open error..............!!"); System.err.println(port+" 포트는 이미 사용중 입니다."); System.exit(1); // 종료 } } @Override public void run() { while (true) { try { System.out.println("\n 접속을 기다 립니다.....!"); // 클라이언트 접속 대기 Socket socket = server.accept(); System.out.println(socket.getInetAddress() + " 로 부터 접속하였습니다."); // 출력 스트림 // 접속한 클라이언트에 데이터를 전송. OutputStream out = socket.getOutputStream(); //-------------- 제거 ---------------- // 입력 스트림 // 클라이언트 에서 보낸 데이터를 받음. // BufferedReader in = new BufferedReader(new InputStreamReader( // socket.getInputStream())); // 클라이언트 데이터 읽기 // String line = in.readLine(); // System.out.println("받은 데이터 : " + line); //----------------------------------- //--------------제거 2---------------- // InputStream in = socket.getInputStream(); // // int len = -1; // byte[] data = new byte[1024]; // int data_size = 0; // while ((len = in.read()) > 0) { // data[data_size] = (byte)len; // data_size++; // // 개행이면 while문을 빠져나감. // if (len == 0x0a) { // break; // } // } // System.out.printf("data_size : %d \n", data_size); // System.out.println(new String(data).trim()); // 바이트 배열을 문자열로 만들고 공백을 제거 함. //------------------------------- //-------------- 추가 -----------------/ InputStream in = socket.getInputStream(); int len = -1; byte[] data = new byte[1024]; byte[] buff = new byte[1024]; // 읽기 버퍼 int data_size = 0; boolean isBreak = false; while ((len = in.read(buff)) > 0) { for (int i=0; i<len; i++) { data[data_size] = buff[i]; data_size++; // 개행이면 while문을 빠져나가도록 isBreak를 true로 설정. if (buff[i] == 0x0a) { isBreak = true; } } // isBreak == true이면 while문을 빠져나감. if (isBreak) { break; } } System.out.printf("data_size : %d \n", data_size); System.out.println(new String(data).trim()); // //------------------------------- // 데이터를 받은후 응답 메세지 송신 out.write("OK \n".getBytes()); out.flush(); // 클라이언트의 접속을 끊음. out.close(); in.close(); socket.close(); } catch (Exception e) { System.err.println(e); } } } /** * @param args */ public static void main(String[] args) { Thread server = new Thread(new TcpServer(1004)); server.start(); } }
추가 된 부분을 보시면 읽기 버퍼와 read()->read(buff)로 바뀌었습니다.
그리고 받은데이터 사이즈로 루프를 돌아 데이터를 처리 합니다.
저번꺼와 크게 다르지 않습니다. 별로 어렵지 않죠?
지금 까지 해왔던건 단순한 통신에 대한 것들이여서 별로 어렵지가 않지만,
통신이 좀더 복잡해지면 소스도 더 복잡하고 구현하기가 어렵습니다.
좀더 쉽게 할려면 Java NIO로 NonBlocking방식의 서버를 구현해 ByteBuffer를 사용하면 좀더 편하게 할 수 있으나,
저도 공부중이어서 지식을 습득하면 올리도록 하겠습니다.
감사합니다.