자바와 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
'JAVA' 카테고리의 다른 글
리눅스에서 class 파일 실행시 Exception in thread "main" java.lang.NoClassDefFoundError (3) | 2009.05.15 |
---|---|
[ JAVA ] 자바 한글 캐릭터 셋 찾기 (0) | 2009.04.29 |
자바로 xml 형식의 String 파싱 (1) | 2009.04.20 |
JFREECHART 실전 코드 (0) | 2009.03.30 |
JFReeChart 한글 처리 방법 (3) | 2009.03.30 |
댓글