Serializable序列化Socket傳送範例

Posted in Java, 程式 on 2009/7/24 by yku 瀏覽:1,417人次 — 3 回應

在socket傳送過程中,

利用ObjectInputStream及ObjectOutputStream傳接送資料

先定義一個Object,

而Object必需implements java.io.Serializable介面

Serializable可以參考Serializable序列化



DataTest.java
package test;

public class DataTest implements java.io.Serializable {
  private int x = 0 ;
  public DataTest()
  {
   
  }
  public void setP(int x)
  {
    this.x = x;
  }
  public int getP()
  {
    return x;
  }
}

再來建立一個Server,

利用ObjectInputStream的ReadObject()把Object讀進來

再把這個Object做想要的處理



SendServer.java
package test;

import java.net.ServerSocket;
import java.net.Socket;



public class SendServer extends java.lang.Thread{
 
  private boolean OutServer = false;
  private ServerSocket server ;
  private final int ServerPort = 8765;

 
  public SendServer()
  {
    try
    {
      server = new ServerSocket(ServerPort);
     
    }
    catch(java.io.IOException e)
    {
      System.out.println("Socket啟動有問題 !" );
      System.out.println("IOException :" + e.toString());
    }
  }
 
 

 
 
  public void run()
  {
    Socket socket ;
    java.io.ObjectInputStream in ;

    System.out.println("伺服器已啟動 !"  );
    while(!OutServer)
    {
      socket = null;
      try
      {
        synchronized(server)
        {
          socket = server.accept();
        }
        System.out.println("取得連線 : InetAddress = " +
socket.getInetAddress
()  );
        socket.setSoTimeout(15000);
       

        in = new
java.io.ObjectInputStream(socket.getInputStream());
       
        DataTest data = (DataTest)in.readObject();
        System.out.println("我取得的值:"+data.getP());
        in.close();
        in = null ;
        socket.close();
       
       
       
      }
      catch(java.io.IOException e)
      {
        System.out.println("Socket連線有問題 !" );
        System.out.println("IOException :" + e.toString());
      }
      catch(java.lang.ClassNotFoundException e)
      {
        System.out.println("ClassNotFoundException :" +
e.toString
());
      }
    }
  }
 
  public static void main(String args[])
  {
    (new SendServer()).start();
  }
 
}
 

最後建立一個socket Client來傳送Object,

利用ObjectOutputStream把Data writeObject()出去



SendClient.java
package test;

import java.net.InetSocketAddress;
import java.net.Socket;
import java.io.ObjectOutputStream;
public class SendClient {
  private String address = "127.0.0.1";
  private int port = 8765;
  public SendClient()
  {
    //準備要傳送的資料
    DataTest data = new DataTest();
      data.setP(102928);
   
    Socket client = new Socket() ;
        InetSocketAddress isa = new
InetSocketAddress(this.address,this.port);
        try
        {
          client.connect(isa,10000);
          ObjectOutputStream out = new
ObjectOutputStream(client.getOutputStream());
          //送出object
          out.writeObject(data);
          out.flush();
          out.close();
          out = null ;
          data = null ;
          client.close();
          client = null ;
         
        }
        catch(java.io.IOException e)
        {
          System.out.println("Socket連線有問題 !" );
      System.out.println("IOException :" + e.toString());
        }
  }
 
  public static void main(String args[])
  {
    new SendClient();
  }
}

-----Server端回應-----

伺服器已啟動 !

取得連線 : InetAddress = /127.0.0.1

我取得的值:102928

原始碼下載

延伸:

Java 1.4可用Serializable類別Object列表



Related Posts with Thumbnails

3 回應 to “Serializable序列化Socket傳送範例”

PingBack List:

  1. [Java]簡單的Socket Client Server
  1. 1
    mlianghua

    您好!

    当我在不同的package建立client和Server的时候,Datatest 也分别在各自的package创建,比如Datatest1.java, Datatest2.java,
    其中两个文件里面都是一样的。运行时出现
    Server 端:
    java.lang.ClassNotFoundException: com.mlh.Datapackage1
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.google.facebook.s_new.run(s_new.java:34)
    at java.lang.Thread.run(Unknown Source)
    Client端:
    TCPC: Connecting...
    TCP C: Sending...
    TCP C: Receiving...
    TCP S: Error
    java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.mlh.mlh_client.main(mlh_client.java:44)

    为什么出现这种错误?

    [回應]

    yku Replay:

    java.lang.ClassNotFoundException是指你的class讀取不到
    請問是否可以提供您的目錄結構呢?
    Datapackage1理論上應該要放在./com/mlh月山錄裡的

    [回應]

留下您想說的話: