제목은 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를 사용하면 좀더 편하게 할 수 있으나,

저도 공부중이어서 지식을 습득하면 올리도록 하겠습니다.


감사합니다.