초보프로그래머만..

자바client <-> C server 간의 소켓통신

세피롯스 2010. 2. 18. 16:55

자바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랑 소켓통신 드럽게 어렵네ㅠㅜ