객체직렬화는 객체를 파일에 저장할 때도 사용되지만, 객체의 네트워크 전송에 유용하다.
----------------------------------------------------------------------------------------
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
댓글 없음:
댓글 쓰기