위 와 같은 형태로 BufferedReader를 통해 readLine형태로 메시지를 전달받고 null일때까지 데이터를 임시 변수에 받아서 저장하는 형태였다.
하지만 전송하는 클라이언트에서 문자열 끝에 개행문자 "\n" 를 처리해주거나 BufferedWriter를 사용해 newLine() 처리를 해주지 않으면 영원히 머물러 있는 무한 대기 현상을 겪었고, 클라이언트측에서는 개행을 보장해주지 않는 상황이라 받는 부분을 개선해야 했다.
BufferedReader의 read()를 사용하여 개선하였다.
개선 소스
publicvoidrun(){
BufferedReader br = null;
PrintWriter pw = null;
try{
String connIp = socket.getInetAddress().getHostAddress();
logger.info(StringUtils.logStr(connIp + "에서 연결 시도."));
int BUF_SIZE = 1024*7;
br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf8"), BUF_SIZE);
pw = new PrintWriter(socket.getOutputStream());
// 클라이언트에서 보낸 문자열 출력
StringBuffer buffer = new StringBuffer();
while(true) {
int ch = br.read();
if((ch<0) || (ch == '\n')) {
break;
}
buffer.append((char) ch);
}
String receiveStr = buffer.toString();
logger.info(StringUtils.logStr("receive msg : " + receiveStr));
객체를 JSON처리하기 위해 GSON과 SIMPLE JSON 라이브러리의 힘을 빌렸습니다.
처음에 구성은 Simple Json만 사용하여 구성해봤지만, 단순 Array에 담은 데이터를 넘기는건 문제가 없지만 Vo객체를 JSONObject에 넣어서 넘기게되면 "key" 처리가 정상적으로 되지 않아 파싱부분에서 에러가 발생하는 것을 발견하였고, 넘기기전에는 Gson을 통해 JSON화하여 넘기도록 하였습니다.
JSON처리하여 소켓통신하기
Server
이번엔 Gson과 simple Json을 사용할 예정이므로 pom.xml에 아래 정보를 추가해야 합니다.
작성하게될 클라이언트에서 JSONObject에 ArrayList<vo> 컬렉션을 "list" 키에 담아서 발송하는 코드를 작성 예정인데, 파싱하는 부분은 Map형태로 되어있습니다. JSON으로 파싱하면서 VO 객체를 단순 Map의 컬렉션처럼 key, value화 시켰기 때문입니다. 같은 VO로 파싱하려고 하면 파싱에러가 발생하는것을 볼 수 있습니다.