자바client <-> C server 간의 소켓통신
자바client와 C server와의 소켓통신
값은 바이트로 주고 받았다.
자바client에서 값을 보내는 메소드이다.
8바이트를 보내줘야하는데 4바이트에는 입력받은 data값을 나머지 4바이트에는 숫자 0을 바이트로 변환하여 보냈다.(C server에서 그렇게 받아야한대서;;;)
public synchronized void sendData(int data)throws Exception { //system.in으로 입력받은 int값을 파라메터로
OutputStream os = socket.getOutputStream();
int bodylen = 0;
try{
byte[] byte_arr = new byte[8];
byte_arr[0] = (byte) (bodylen & 0x000000FF);
byte_arr[1] = (byte) ((bodylen >> 8) & 0x000000FF);
byte_arr[2] = (byte) ((bodylen >> 16) & 0x000000FF);
byte_arr[3] = (byte) ((bodylen >> 24) & 0x000000FF);
byte_arr[4] = (byte) (data & 0x000000FF);
byte_arr[5] = (byte) ((data >> 8) & 0x000000FF);
byte_arr[6] = (byte) ((data >> 16) & 0x000000FF);
byte_arr[7] = (byte) ((data >> 24) & 0x000000FF);
//요건 제대로 바이트로 변환됐는데 확인차원에서 되돌려본것임
int temp;
temp = (int)byte_arr[0] & 0x000000FF;
temp |= ((int)byte_arr[1] << 8) & 0x0000FF00;
temp |= ((int)byte_arr[2] << 16) & 0x00FF0000;
temp |= ((int)byte_arr[3] << 24) & 0xFF000000;
temp |= (int)byte_arr[4] & 0x000000FF;
temp |= ((int)byte_arr[5] << 8) & 0x0000FF00;
temp |= ((int)byte_arr[6] << 16) & 0x00FF0000;
temp |= ((int)byte_arr[7] << 24) & 0xFF000000;
System.out.println("temp byte[] to int : "+temp); //확인차원에서
BufferedOutputStream buwriter = new BufferedOutputStream(os);
buwriter.write(byte_arr); //바이트배열을 write
buwriter.flush();
}catch(Exception e1){
e1.printStackTrace();
}
}
이제 제대로 보내졌으니 server에서 받아온 데이터를 읽어들인다.
12바이트로 8바이트는 헤더이고 4바이트가 내가 실제 받기원하는값이다.
private void receiveData() {
try {
InputStream is = socket.getInputStream();
DataInputStream data = new DataInputStream(is);
byte[] by = new byte[12];
data.read(by); //바이트배열로 읽어들임
//C에서 받는 바이트배열은 바이트오더가 반대라나??
//그래서 11,10,9,8순서로 변환햇다
long l = 0;
l |= by[3] & 0xFF;
l <<= 8;
l |= by[2] & 0xFF;
l <<= 8;
l |= by[1] & 0xFF;
l <<= 8;
l |= by[0] & 0xFF;
long l1 = 0;
l1 |= by[7] & 0xFF;
l1 <<= 8;
l1 |= by[6] & 0xFF;
l1 <<= 8;
l1 |= by[5] & 0xFF;
l1 <<= 8;
l1 |= by[4] & 0xFF;
long l2 = 0;
l2 |= by[11] & 0xFF;
l2 <<= 8;
l2 |= by[10] & 0xFF;
l2 <<= 8;
l2 |= by[9] & 0xFF;
l2 <<= 8;
l2 |= by[8] & 0xFF;
System.out.println("첫번째4바이트변환값 : "+ l);
System.out.println("두번째4바이트변환값 : "+ l1);
System.out.println("세번째4바이트변환값 : "+ l2);
} catch(Exception e) {e.printStackTrace();}
}
자바랑 C랑 소켓통신 드럽게 어렵네ㅠㅜ