본문으로 바로가기

[자바] 네트워크 통신시 주의할점

category 프로그래밍/자바 2019. 1. 23. 17:33

네트워크 통신을 한다면 I/O를 공부하고 넘어왔을것이다.

I/O만 가지고 통신할때는 특별히 어려운게 없다고 생각할수도 있다.

그러나 네트워크 ( socket ) 통신을 하다보면 생각과 다르다는것을 느낄수있다. 

주로 자주 볼수 있는 에러가 connection reset... 소켓이 끊어지거나 데이터를 반복적으로 보내는데 일정 부분에서 blocking 당하는 모습을 볼수있다.

이유는 보통 서로 주고 받는 read,write할때 데이터의 양의 문제가 가장크다.

예를들어 클라이언트에서 write(100)을 했다면 서버에서 read(100)을 하면 되겠지라는 생각을 할수 있는데 

이런 생각으로 코딩을 하게 되면 상당히 큰 봉변을 당하게 된다.ㅋㅋ

이걸 해결하기 좋은 방법은 클라이언트에서 데이터 500을 보내게 된다면 데이터를 500를 보내기전에 서버에 500데이터를 보낼꺼라고 전송하고

서버측에서 read를 할때 데이터가 불규칙하게 들어올수가 있다. 그렇기 때문에 읽어들일 데이터를 500으로 고정으로 해놓고 읽어들인 데이터를 고정해놓은 500에서 빼면서 0이 되면 더이상 서버에서 read를 하지 않는 방식으로 코드를 짜야한다.




I/O stream과 Network(socket)

: 통신을 하다보면 데이터를 보냈는데 원하는 만큼의 데이터를 받지 못하는 경우가 있다.

why?
1.보내는쪽과 받는쪽의 데이터양이 서로 달라서 대기중인 경우
2.stream은 블로킹이기 때문에 다음의 작업이 끝나야지만 다음으로 넘어간다.

3.handshake가 오래걸리는 경우 커넥션 타임아웃이 발생, 일정시간이 지나면 끝난다. 

네트워크를 깊게 하진 않았지만 3가지 이유가 많이 발생하는것 같다.






Ex_예제)


<Client>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
File myFile = new File(file);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
 
 
dos.writeLong(myFile.length());
 
int bytesRead = 0;
    
long size = myFile.length();
byte[] buffer = new byte[8192];
while (size > 0 && (bytesRead = bis.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
        dos.write(buffer, 0, bytesRead);
        dos.flush();
        size -= bytesRead;
}
cs

 


<Server>

1
2
3
4
5
6
7
8
9
10
11
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file));
 
int bytesRead = 0;
long size = dis.readLong();
byte[] buffer = new byte[8192];
while (size > 0 && (bytesRead = dis.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
        output.write(buffer, 0, bytesRead);
        output.flush();
        size -= bytesRead;
}
output.close();
cs


'프로그래밍 > 자바' 카테고리의 다른 글

[JAVA] 데몬(daemon) 스레드 정리  (0) 2019.01.27
Thread와 Process!!  (0) 2019.01.25
Network란 무엇인가?  (0) 2019.01.18
[Java] 해싱(Hashing)이란?  (0) 2019.01.08
[Java] Object 클래스란?  (0) 2019.01.08