ImJa 보드는 Java 언어만으로 TCP/IP, UDP/IP, 시리얼, UDS 등 다양한 통신 프로그램을 작성할 수 있습니다만, 함께 제공되는 ImJa 라이브러리를 이용하면 더욱 간결하고 생산성이 높은 통신 프로그램을 작성할 수 있습니다. ImJa 보드에서 어떤 방식으로 통신 프로그램을 작성하는지 예제를 통해 설명하겠습니다.


본 글에서 소개하는 TCP/IP 서버 프로그램은 수신된 문자열을 화면에 출력하고 반환하는 에코 프로그램입니다. 프로그램 소스는 아래와 같습니다.

package tcpServerSample;

import com.falinux.imja.Poll;
import com.falinux.imja.Tcp;
import com.falinux.imja.TcpServer;

import java.nio.ByteBuffer;

public class TcpServerSampleMain implements Runnable {
    private Poll poll;
    private TcpServer tcpServer;

    private final ByteBuffer readBuffer = ByteBuffer.allocateDirect(1024);
    private final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(1024);

    class TcpC extends Tcp {
        @Override
        public long open() {
            return 0;
        }

        @Override
        public int onRead(long handle) {
            System.out.print("Read from client:");
            int readBytes = this.read(readBuffer);	// 받은 데이터 읽기
            byte[] buf = new byte[readBytes];		// byte배열 선언

            readBuffer.flip();						// 읽은 데이터 설정
            readBuffer.get(buf);					// byte배열에 데이터 설정
            readBuffer.compact();					// bytebuff 포지션 재설정

            writeBuffer.put(buf);					// 수신된 데이터를 write buffer에 설정
            writeBuffer.flip();						// write buffer 데이터 설정
            this.write(writeBuffer);				// 데이터 전송
            writeBuffer.compact();					// bytebuff포지션 재설정

            System.out.println(new String(buf, 0, readBytes));

            return readBytes;
        }

        @Override
        public int onWrite(long handle) {
            return 0;
        }

        @Override
        public int onError(long handle) {
            return 0;
        }

        @Override
        public int onHup(long handle) {
            return 0;
        }

        @Override
        public int onTimeOut(long handle) {
            return 0;
        }

        @Override
        public int onDisconnect(long handle) {
            return 0;
        }
    }


    public TcpServerSampleMain(int port, int clientCount) {
        
    	poll = new Poll();	// 통신 라이브러리 초기화

        tcpServer = new TcpServer(port, clientCount) {
            @Override
            public int onRead(long handle) {
                System.out.println("New client connected...");
                return tcpServer.accept(new TcpC());	// 새로운 클라이언트 생성
            }

            @Override
            public int onWrite(long handle) {
                return 0;
            }

            @Override
            public int onError(long handle) {
                return 0;
            }

            @Override
            public int onHup(long handle) {
                return 0;
            }

            @Override
            public int onTimeOut(long handle) {
                return 0;
            }

            @Override
            public int onDisconnect(long handle) {
                return 0;
            }
        };
    }

    @Override
    public void run() {
        tcpServer.open();	// TCP서버 open
        poll.rebuild();		// 통신 객체 목록 갱신

        while (true) {
            poll.pollDoLoop(100);
        }
    }

    public static void main(String[] args) {
    	
        new TcpServerSampleMain(5555, 2).run();
    }
}

프로그램 예제의 main()을 보시면 TCP/IP 포트 번호는 5555로 사용하고 클라이언트는 동시에 2까지 접속할 수 있도록 했습니다. 이제 이클립스에서 프로그램을 직접 작성하겠습니다.


000 ImJa TCP Server.png

▲ TCP  서버 샘플을 작성하기 위해 tcpServerSample로 프로젝트를 생성합니다.


001 ImJa TCP Server.png

▲ 프로젝트가 생성되었습니다. 아래 글을 참고해서 jsch.jar과 imja.jar 라이브러리를 추가합니다.



002 ImJa TCP Server.png

▲ 필요한 라이브러리가 추가되었습니다. 이제 소스 코드를 작성하면 됩니다.


003 ImJa TCP Server.png

▲ src 폴더를 마오른쪽 버튼 클릭 후 New>>Class를 실행합니다. 샘플 객체 이름을 TcpServerSampleMain이라고 하겠습니다.


004 ImJa TCP Server.png

▲ TcpServerSampleMain 객체 프로그램 코드를 작성합니다.


005 ImJa TCP Server.png

▲ 소스 코드를 작성했으니 Build.xml과 build.propertyiies를 생성합니다. Build.xml과 build.propertyiies 내용은 아래와 같습니다.


>>> Build.xml


<?xml version="1.0" encoding="UTF-8"?>
<!-- 프로젝트 이름을 입력한다. -->
<project name= "ImJa_example" basedir= ".">

         <!-- 빌드 프로퍼티 파일 -->
         <property file= "build.properties" />

         <!-- Java Compile-->
         <target name= "compile" description= "Compile!!!" depends= "">
                <echo message="------------------------------" />
                <echo message="Java Compile!!!!  " />
                <echo message="------------------------------" />
                <javac target= "${java.target}"
                        nowarn="true"
                        deprecation="true"
                        debug="true"
                        listfiles="false"
                        failonerror="true"
                        optimize="false"
                        includeantruntime="false"
                        srcdir="${basedir}/src"
                        destdir="${basedir}/bin"
                        encoding="${java.compile.encoding}">
                </javac>
         </target>

         <!-- make jar-->
         <target name= "make_jar_nfs" depends= "compile">
                <echo message="------------------------------" />
                <echo message=" Make Jar : ${jar.name}.jar" />
                <echo message="------------------------------" />
                <mkdir dir= "./jar" />
                <jar destfile="${nfs.dir}/${jar.name}.jar" basedir="${basedir}/bin">
                </jar>
         </target>
        
         <!-- target device upload-->
         <target name= "target_device_upload" depends= "make_jar_nfs">
                <echo message="------------------------------" />
                <echo message=" Target device Upload" />
                <echo message="------------------------------" />
           <scp  file="${nfs.dir}/${jar.name}.jar"
            todir="${target.id}@${target.ip}:${target.dir}"
            password="${target.pw}"
                 trust="true"/>
         </target>

</project>


>>> build.propertyiies


# NFS folder
nfs.dir=nfs

#java encoding
java.compile.encoding=UTF-8

#java compile version
java.target=1.7

#java jar name
jar.name=appTcpServerSample

#upload target info
target.ip=192.168.2.75
target.id=root
target.pw=falinux
target.dir=/home


build.propertyiies를 보면 생성할 실행 파일 이름은 appTcpServerSample이고 ImJa 보드의 IP는 192.168.2.75, 로그인 ID와 암호는 각각 root에 falinux이며, 실행 파일 저장 위치는 /home이 되겠습니다.


006 ImJa TCP Server.png

▲ Ant 스크립트를 이용하여 소스 파일을 컴파일하고 ImJa 보드로 실행 파일을 전송합니다.


007 ImJa TCP Server.png

▲ ImJa 보드에서 예제 실행 파일을 실행합니다. 실행 방법은 위 이미지에서처럼 아래와 같이 입력하여 실행합니다.


  • ]# java -cp appTcpServerSample.jar tcpServerSample.TcpServerSampleMain


008 ImJa TCP Server.png

▲ TCP/IP 문자열 전송 프로그램을 이용하여 포트 번호 5555로 문자열을 전송하면 송수신하는 모습을 확인할 수 있습니다.


다음 시간에는 ImJa 보드에서 TCP/IP 클라이언트 예제 프로그램을 올리겠습니다.