2009년 6월 28일 일요일

객체의 네트워크 전송

 
출처 novice | robiz
원문 http://blog.naver.com/robiz/110009716711

객체직렬화는 객체를 파일에 저장할 때도 사용되지만, 객체의 네트워크 전송에 유용하다.

 

----------------------------------------------------------------------------------------

NetworkSerialize.java

 

 

import java.io.*;

 

public class NetworkSerialize implements Serializable

{

    // 멤버변수

    private int num;;

    private String name;

   

    // 생성자

    public NetworkSerialize(int n,String s)

    {

        num = n;

        name = s;

    }

 

    // toString() 메서드를 오버라이드하여

    // println() 메서드에서 사용할때 내용을 출력하도록 변경

    public String toString()

    {

        return "이름은 " +name+ " : " +num;

    }

}

 

 

 

NetworkClient.java

 

 

import java.io.*;
import java.net.*;


public class NetworkClient
{
    public static void main(String args[])
    {
        try
      {
           // 실행시에 호스트 이름과 해당포트를 명시해야 함
           if(args.length != 2)
               throw new IllegalArgumentException("인자의 수가 두개여야 함");

 

            // 인자로부터 호스트이름과 포트번호를 얻어냄
            String host = args[0];
            int port = Integer.parseInt(args[1]);
            System.out.println(host + ":" + port);

 

           // 소켓 클래스 객체를 생성, 생성시 해당서버와 접속을 시도함.
           Socket soc = new Socket(host,port);

 

           // 소켓 클래스 객체로부터 ObjectOutputStream을 얻어냄
           ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());

 

           // 전송할 객체를 생성한다.
           NetworkSerialize ns1 = new NetworkSerialize(1,"김범로");

 

           // ObjectOutputStream 을 얻어낸다.
           oos.writeObject(ns1);

 

           // ObjectOutputStream을 flush 한다.
           oos.flush();

 

   // 소켓 접속을 끊는다.
   soc.close();
  }catch(Exception e)
   {System.err.println(e);
        System.err.println("사용법: java Client 호스트이름 포트");}
    }
}

 

 

 

NetworkServer.java

 

import java.io.*;
import java.net.*;
import java.util.*;

 

public class NetworkServer
{
     // 13번을 포트번호로 할당
     public static final int PORT = 13;
 
     public static void main(String args[])
     {
          ServerSocket ss;
          Socket cs;
          ObjectInputStream ois;

 

          try
         {
               // 서버소켓을 생성
               ss = new ServerSocket(61000);

 

               while(true)
              {
                  // 서버 소켓의 accept() 메서드를 호출하여
                  // 접속감시 상태로 들어감.
                  // 접속이 일어나면 소켓 클래스 객체가 생성됨
                 cs = ss.accept();

 

                 // 소켓 클래스 객체에서 PrintStream을 생성함
                 ois = new ObjectInputStream(cs.getInputStream());

 

                 // 객체를 읽어냄
                 NetworkSerialize ns = (NetworkSerialize)ois.readObject();

 

                 // 화면에 읽어낸 값을 출력함
                 System.out.println("네트워크 전송된 객체는 " +ns.toString());

 

                 // 소켓 접속을 끊음
                 cs.close();

 

                // 서버소켓을 닫음
                ss.close();
             }
       }catch(IOException ioe) {System.err.println(ioe);}
        catch(ClassNotFoundException cnfe) {System.err.println(cnfe);}
 }
}

 

 

----------------------------------------------------------------------------------------

2개의 도스창을 열어서, 하나는 NetworkServer를 실행시키고,

다른 하나는 NetworkClient를 실행시킨다.

 

첫번째 도스창: j

java NetworkServer

 

두번째 도스창:

java NetworkClient  localhost  61000

 

-----------------------------------------------------

실행 결과

 

네트워크로 전송된 객체는 이름은 김범로 : 1
java.net.SocketException: Socket is closed

댓글 없음:

댓글 쓰기