zoukankan      html  css  js  c++  java
  • java线程之三 对象传输

    之前例子中已经介绍了如何使用socket进行信息的传输,及其如何进行多客户端的通信。

    但是实际开发中,我们不可能只传输简单的基础类型的数据。更多的是要传输一个对象,或则信息包。

    因此今天的场合要用到ObjectInputStream/ObjectOutputStream对象。

    要传输对象,我们首先定义一个对象类User

     1 public class User implements Serializable{
     2     
     3     
     4     /**
     5      * java.io.InvalidClassException: com.lwx.bean.User; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 8089718401965834129
     6 
     7      */
     8     private static final long serialVersionUID = 8089718401965834129L;
     9     public User() {
    10 
    11     }
    12 
    13     public User(int id, String name) {
    14         this.id = id;
    15         this.name = name;
    16     }
    17 
    18     private int id;
    19     private String name;
    20     public int getId() {
    21         return id;
    22     }
    23 
    24     public void setId(int id) {
    25         this.id = id;
    26     }
    27 
    28     public String getName() {
    29         return name;
    30     }
    31 
    32     public void setName(String name) {
    33         this.name = name;
    34     }
    35 
    36 }

    注意的是,对象必须进行实例化。同时生成serialVersionUID。

    接着我们创建服务端程序

    服务端代码

     1 /**
     2  * @author  draem0507@gmail.com
     3  * @TODO    java线程开发之三 对象传输
     4  * @version 1.0
     5  * @date 2013-5-7下午09:22:45    
     6  * @blgos myblog:http://www.cnblogs.com/draem0507
     7  */
     8 
     9 public class ServerTest {
    10     private ServerSocket serverSocket;
    11 
    12     
    13 
    14     public ServerTest() {
    15         try {
    16             serverSocket = new ServerSocket(10000);
    17             // 开启无限循环 创建每个客户端的socket线程
    18             while (true) {
    19                 Socket socket = serverSocket.accept();
    20                 new ReceiveSocket(socket).start();
    21             }
    22         } catch (IOException e) {
    23             // TODO Auto-generated catch block
    24             e.printStackTrace();
    25         }
    26 
    27     }
    28 
    29     public static void main(String[] args) {
    30         new ServerTest();
    31 
    32     }
    33 
    34     private class ReceiveSocket extends Thread {
    35         private Socket socket;
    36 
    37         public ReceiveSocket(Socket socket) {
    38             this.socket = socket;
    39         }
    40 
    41         private ObjectInputStream reader;
    42         private ObjectOutputStream writer;
    43 
    44         @Override
    45         public void run() {
    46 
    47             try {
    48                 reader=new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
    49                 //writer=new ObjectOutputStream(socket.getOutputStream());
    50                 // 开启无限循环 监控消息
    51                 
    52                     //java.io.EOFException
    53                 Object obj=    reader.readObject();
    54                     if(obj!=null)
    55                     {
    56                         User user =(User)obj;
    57                         System.out.println("id=="+user.getId()+"\tname=="+user.getName());
    58                     }
    59                 //    while (true) {}
    60 
    61             } catch (IOException e) {
    62                 // TODO Auto-generated catch block
    63                 e.printStackTrace();
    64             } catch (ClassNotFoundException e) {
    65                 // TODO Auto-generated catch block
    66                 e.printStackTrace();
    67             } finally {
    68                 if (null != reader) {
    69                     try {
    70                         reader.close();
    71                     } catch (IOException e) {
    72                         // TODO Auto-generated catch block
    73                         e.printStackTrace();
    74                     }
    75                 }
    76                 if (null != writer) {
    77                     try {
    78                         reader.close();
    79                     } catch (IOException e) {
    80                         // TODO Auto-generated catch block
    81                         e.printStackTrace();
    82                     }
    83                 }
    84                 try {
    85                     socket.close();
    86                 } catch (IOException e) {
    87                     // TODO Auto-generated catch block
    88                     e.printStackTrace();
    89                 }
    90             }
    91 
    92         }
    93 
    94     }
    95 
    96 }

    客户端代码

     1 public class ClientTest {
     2     
     3     
     4     public static void main(String[] args) throws Exception {
     5         
     6         Socket socket = new Socket("localhost", 10000);
     7         //ObjectInputStream in=new ObjectInputStream(socket.getInputStream());
     8         ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());
     9         
    10         
    11                 User user =new User();
    12                 user.setId(1);
    13                 user.setName("lwx_"+1);
    14                 out.writeObject(user);
    15                 out.flush();
    16     
    17             
    18         socket.close();
    19         
    20         
    21     }
    22 }

    老规矩,先运行服务端,在执行客户端。这里跟之前相对,并没有实现服务端往客户端发送信息,要测试的朋友自己加代码,a piece of cake.

    在看csdn的时候,看到有人写道关于压缩传输的介绍,就顺便把代码贴上来。

    压缩服务端代码

     1 //压缩对象的方式传输
     2 public class MyServer {
     3 
     4     private final static Logger logger = Logger.getLogger(MyServer.class.getName());
     5     
     6     public static void main(String[] args) throws IOException {
     7         ServerSocket server = new ServerSocket(10000);
     8 
     9         while (true) {
    10             Socket socket = server.accept();
    11             socket.setSoTimeout(10 * 1000);
    12             invoke(socket);
    13         }
    14     }
    15 
    16     private static void invoke(final Socket socket) throws IOException {
    17         new Thread(new Runnable() {
    18             public void run() {
    19                 GZIPInputStream gzipis = null;
    20                 ObjectInputStream ois = null;
    21                 GZIPOutputStream gzipos = null;
    22                 ObjectOutputStream oos = null;
    23                 
    24                 try {
    25                     gzipis = new GZIPInputStream(socket.getInputStream());
    26                     ois = new ObjectInputStream(gzipis);
    27                     gzipos = new GZIPOutputStream(socket.getOutputStream());
    28                     oos = new ObjectOutputStream(gzipos);
    29 
    30                     Object obj = ois.readObject();
    31                     User user = (User)obj;
    32                     System.out.println("user: " + user.getId() + "/" + user.getName());
    33 
    34                     user.setName(user.getName() + "_new");
    35                     user.setId(user.getId() *2);
    36 
    37                     oos.writeObject(user);
    38                     oos.flush();
    39                     gzipos.finish();
    40                 } catch (IOException ex) {
    41                     logger.log(Level.SEVERE, null, ex);
    42                 } catch(ClassNotFoundException ex) {
    43                     logger.log(Level.SEVERE, null, ex);
    44                 } finally {
    45                     try {
    46                         ois.close();
    47                     } catch(Exception ex) {}
    48                     try {
    49                         oos.close();
    50                     } catch(Exception ex) {}
    51                     try {
    52                         socket.close();
    53                     } catch(Exception ex) {}
    54                 }
    55             }
    56         }).start();
    57     }
    58 }

    压缩客户端代码

     1 public class MyClient {
     2     
     3     private final static Logger logger = Logger.getLogger(MyClient.class.getName());
     4     
     5     public static void main(String[] args) throws Exception {
     6         for (int i = 0; i < 10; i++) {
     7             Socket socket = null;
     8             GZIPOutputStream gzipos = null;
     9             ObjectOutputStream oos = null;
    10             GZIPInputStream gzipis = null;
    11             ObjectInputStream ois = null;
    12             
    13             try {
    14                 socket = new Socket();
    15                 SocketAddress socketAddress = new InetSocketAddress("localhost", 10000); 
    16                 socket.connect(socketAddress, 10 * 1000);
    17                 socket.setSoTimeout(10 * 1000);
    18                 
    19                 gzipos = new GZIPOutputStream(socket.getOutputStream());
    20                 oos = new ObjectOutputStream(gzipos);
    21                 User user = new User(  i, "lwx_" + i);
    22                 oos.writeObject(user);
    23                 oos.flush();
    24                 gzipos.finish();
    25                 
    26                 gzipis = new GZIPInputStream(socket.getInputStream());
    27                 ois = new ObjectInputStream(gzipis);
    28                 Object obj = ois.readObject();
    29                 if (obj != null) {
    30                     user = (User)obj;
    31                     System.out.println("user: " + user.getId() + "/" + user.getName());
    32                 }
    33             } catch(IOException ex) {
    34                 logger.log(Level.SEVERE, null, ex);
    35             } finally {
    36                 try {
    37                     ois.close();
    38                 } catch(Exception ex) {}
    39                 try {
    40                     oos.close();
    41                 } catch(Exception ex) {}
    42                 try {
    43                     socket.close();
    44                 } catch(Exception ex) {}
    45             }
    46         }
    47     }
    48 }
  • 相关阅读:
    wpf数据验证实例及常用方法小结
    wpf自定义colorpicker
    DataGrid绑定Dictionary问题
    DataTemplate和ControlTemplate的关系
    Validation Rule和Binding Group
    WPF converter(包含传递复杂参数)
    【链接】Eclipse的Debug调试技巧
    安装apache服务出错,无法启动此程序,因为计算机中丢失VCRUNTIME140.dll
    apache解压版安装服务
    apache——(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 : AH00072: make_sock: could not bind to address [::]:443
  • 原文地址:https://www.cnblogs.com/draem0507/p/3066485.html
Copyright © 2011-2022 走看看