본문 바로가기
JAVA

자바와 C 사이의 SOCKET 통신 (BYTE로 통신,보너스로 LITTLE ENDIAN까지)

by 정윤재 2009. 4. 21.

자바와 C 사이의 데이터 통신을 BYTE로 구현을 하려니

제가 알고 있던 것들에서 한계가 오기 시작하더군요.

0X16 막 이런거 나오고... 돌아버리는줄 알았습니다. 하지만...

이런거 몰라도 구현 가능하다는 말씀... OFFSET 개념만 있으면

크게 어렵지 않게 구현할 수 있습니다.

OFFSET 이란 BYTE[] 에서 위치죠.

OFFSET 이 4 라면...

BYTE[4] 인것입니다. 그정도만 알고 계시면 다음 코드는 잘 이해가 가실겁니다.

이걸 겁만 먹고 있다가 구현하는데 죽는줄 알았죠.

정말 하늘이 무너지는줄 알았는데 잘되서 다행입니다.

여러분들도 좋은일에 많이 쓰시길 빕니다.


package VRS;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class VrsServerTest { public static void main(String[] args){
  try{
   //ServerSocket ss = new ServerSocket(123);
   //()?�용??port
   System.out.println("시스템 시작");
/*     while(true) {
     
                Socket soc = ss.accept();
                System.out.println(soc.getInetAddress()+" connected");
                new VrsServerTestThread(soc).start();
    
           } //while
          
*/            VrsServerTest VR = new VrsServerTest();
    VR.listening();
  }catch(Exception e){
   Log.TraceLog(e.toString());
  }//try catch
 }
 
 
 public void listening() {
  System.out.println("Wating Client.... .");
  ServerSocket serverSocket     =  null;
  try{
   serverSocket       =  new ServerSocket(3161);
  }catch(Exception ee){
   ee.printStackTrace();
  }
  while (true) {
   try {
    
    System.out.print("111111");
    Socket socket      =  serverSocket.accept();
    System.out.println("2222");
    //System.out.println("ip=>"+socket.getInetAddress()+"  connected");
    System.out.println("접속되었습니다.");
    Thread serverThread     =  new VrsServerTestThread(socket);
    serverThread.start();
   } catch(Exception e) {
    e.printStackTrace();
    Log.TraceLog(e.toString());
   }
  }
 }
 
}

 

 

class VrsServerTestThread extends Thread{
 Socket soc;
 public VrsServerTestThread(Socket soc){
  this.soc = soc;
 }//
 public void run(){
  try{
   
   DataInputStream  dis  = new DataInputStream(soc.getInputStream());
   DataOutputStream dos  = new DataOutputStream(soc.getOutputStream());
   
   byte [] rcvData   = new byte [ 16 ]; 
   byte [] results   = new byte [ 16 ];
   
   
   dis.read( rcvData, 0, rcvData.length );
     
    
   
   ByteBuffer buffer2 = ByteBuffer.allocate(16);
   buffer2.order(ByteOrder.LITTLE_ENDIAN);
    //buffer2.order(ByteOrder.BIG_ENDIAN);
   //자바에서 일반적으로 쓰이는 BIG ENDIAN의 경우 아래와 같이 쓰면 된다.
   
   //little endian이냐 big endian 이냐 설
   
   byte [] t_sub1= getbytes(rcvData,0,4);
   byte [] t_sub2= getbytes(rcvData,4,4);
   byte [] t_sub3= getbytes(rcvData,8,4);
   byte [] t_sub4= getbytes(rcvData,12,4);
   buffer2.put(t_sub1);
   buffer2.put(t_sub2);
   buffer2.put(t_sub3);
   buffer2.put(t_sub4);
   
      int i1=buffer2.getInt(0); //0번째 offset에서부터  인트형 1개 데이터 추출(0번째 offset~3번째 offset)
      //int는 4byte
      int i2=buffer2.getInt(4);//4번째 offset에서부터  인트형 1개 데이터 추출(4번째 offset~7번째 offset)
      int i3=buffer2.getInt(8);//8번째 offset에서부터  인트형 1개 데이터 추출(7번째 offset~11번째 offset)
      int i4=buffer2.getInt(12);//12번째 offset에서부터  인트형 1개 데이터 추출(12번째 offset~15번째 offset)
   
     
      System.out.println("one:"+i1);
      System.out.println("two:"+i2);
      System.out.println("three:"+i3);
      System.out.println("four:"+i4);
     
     
      ByteBuffer buffer = ByteBuffer.allocate(16);
      buffer.order(ByteOrder.LITTLE_ENDIAN);
      //buffer.order(ByteOrder.BIG_ENDIAN);
      buffer.putInt(22);
      buffer.putInt(67);
      buffer.putInt(0);
      buffer.putInt(77);
      results = buffer.array();
     
     
     
      dos.write(results,0,results.length);
   dos.flush();
   
   
   
   
   
     
  }catch(Exception e){
   Log.TraceLog(e.toString());
  }//try catch
 }//run()
    public static final byte[] getbytes(byte src[], int offset, int length)
     {
         byte dest[] = new byte[length];
         System.arraycopy(src, offset, dest, 0, length);
         return dest;
     }
}//VRSServerFrameThread


댓글