강좌 & 팁
글 수 2,412
2013.11.12 19:55:34 (*.52.177.249)
40547
저번 시간에 얘기 했듯이 BufferedReader가 아닌
InputStream으로 삽질하는 방법에 대해 한번 알아보도록 하겠습니다.
순서는
[Java]TcpServer만들기를 참조 : http://forum.falinux.com/zbxe/index.php?document_srl=783046
BufferedReader -> InputStream으로 변경한 소스는 아래와 같습니다.
[샘플 소스]
//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); //----------------------------------- //--------------추가---------------- 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()); // 바이트 배열을 문자열로 만들고 공백을 제거 함. //------------------------------- // 데이터를 받은후 응답 메세지 송신 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(); } }
소스내용에 보면 //-----제거----, //------추가------ 라고 되어있는 코멘트가 있습니다.
그부분이 BufferedReader -> InputStream로 바뀐 부분입니다.
그게 달라진건 while문을 사용해 한바이트씩 받아 바이트 배열에 차곡차곡 쌓아 패킷의 끝인 개행을 받으면
while문을 빠져나가 바이트 배열을 문자열로 바꿉니다.
BufferedReader에서는 readLine()라는 메서드가 알아서 처리 해주지만 한바이트씩 받아 처리 할려면 받을때 마다
체크를 해줘야합니다.
한 바이트씩 처리 하다보니 시간도 더 걸리구요.
많이 불편 하죠??? ^^;
클라이언트 소스는
[Java]TcpClient 만들기 : http://forum.falinux.com/zbxe/index.php?document_srl=783240 로 실행 결과와 동일 합니다.
다음 시간은 한 바이트씩 처리 하는게 아니라 버퍼를 만들어 버퍼로 하는 방법을 해보겠습니다.
감사합니다.