socket, nio socket,及xml传递object 方法

本文详细介绍如何使用传统Socket及NIO技术实现Java对象的序列化传输,包括配置代理访问服务端、对象序列化原理与实践、利用ByteBuffer进行对象交换等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:如何通过socket代理来访问服务端:

  1. String proxyHost =  "192.168.204.212" ;   
  2. String proxyPort =  "1080" ;   
  3.   
  4. //通知Java要通过代理进行连接。
    正在装载数据……
      
  5. System.getProperties().put( "socksProxySet" , "true" );   
  6. //指定代理所在的机器   
  7. System.getProperties().put( "socksProxyHost" ,proxyHost);   
  8. //指定代理监听的端口。   
  9. System.getProperties().put( "socksProxyPort" ,proxyPort);    
  10.   
  11. String host =  "134.01.69.80" ;   
  12. int  port =  12086 ;   
  13. System.out.println( "connetioning:"  + host +  ":"  + port);   
  14. server =  new  Socket(host, port);  

二:老socket传递Object对象:

要传递的对象:

  1. public   class  Employee  implements  Serializable {    
  2.   
  3.         private   int  employeeNumber;    
  4.         private  String employeeName;    
  5.   
  6.        Employee( int  num, String name) {    
  7.           employeeNumber = num;    
  8.           employeeName= name;    
  9.        }    
  10.   
  11.          public   int  getEmployeeNumber() {    
  12.            return  employeeNumber ;    
  13.        }    
  14.   
  15.         public   void  setEmployeeNumber( int  num) {    
  16.           employeeNumber = num;    
  17.        }    
  18.   
  19.         public  String getEmployeeName() {    
  20.            return  employeeName ;    
  21.        }    
  22.   
  23.         public   void  setEmployeeName(String name) {    
  24.           employeeName = name;    
  25.        }    
  26.     }   

client:

  1. public   class  Client {   
  2.      public   static   void  main(String[] arg) {   
  3.          try  {   
  4.             Employee joe =  new  Employee( 150"Joe" );   
  5.             System.out.println( "employeeNumber= "  + joe.getEmployeeNumber());   
  6.             System.out.println( "employeeName= "  + joe.getEmployeeName());   
  7.             Socket socketConnection =  new  Socket( "127.0.0.1"11111 );   
  8.             ObjectOutputStream clientOutputStream =  new  ObjectOutputStream(   
  9.                     socketConnection.getOutputStream());   
  10.             ObjectInputStream clientInputStream =  new  ObjectInputStream(   
  11.                     socketConnection.getInputStream());   
  12.             clientOutputStream.writeObject(joe);   
  13.             joe = (Employee) clientInputStream.readObject();   
  14.             System.out.println( "employeeNumber= "  + joe.getEmployeeNumber());   
  15.             System.out.println( "employeeName= "  + joe.getEmployeeName());   
  16.             clientOutputStream.close();   
  17.             clientInputStream.close();   
  18.         }  catch  (Exception e) {   
  19.             System.out.println(e);   
  20.         }   
  21.     }   
  22. }  

server端:

java 代码
  1. public   class  Server {   
  2.      public   static   void  main(String[] arg) {   
  3.         Employee employee =  null ;   
  4.          try  {   
  5.             ServerSocket socketConnection =  new  ServerSocket( 11111 );   
  6.             System.out.println( "Server Waiting" );   
  7.             Socket pipe = socketConnection.accept();   
  8.             ObjectInputStream serverInputStream =  new  ObjectInputStream(pipe   
  9.                     .getInputStream());   
  10.             ObjectOutputStream serverOutputStream =  new  ObjectOutputStream(pipe   
  11.                     .getOutputStream());   
  12.             employee = (Employee) serverInputStream.readObject();   
  13.             employee.setEmployeeNumber( 256 );   
  14.             employee.setEmployeeName( "li" );   
  15.             serverOutputStream.writeObject(employee);   
  16.             serverInputStream.close();   
  17.             serverOutputStream.close();   
  18.         }  catch  (Exception e) {   
  19.             System.out.println(e);   
  20.         }   
  21.     }   
  22. }  

三:nio socket传递Object:

client:

  1. public   class  Client {   
  2.      private  String hostname;   
  3.        
  4.      private   int  port;   
  5.        
  6.      public  Client(String hostname,  int  port)   
  7.     {   
  8.          this .hostname = hostname;   
  9.          this .port = port;   
  10.     }   
  11.   
  12.      public   static   void  main(String[] args) {   
  13.         String hostname =  "192.168.0.81" ;   
  14.          int  port =  8234 ;   
  15.         Student stu =  new  Student();   
  16.         stu.setId( 849 );   
  17.         stu.setName( "Squall" );   
  18.         Client client =  new  Client(hostname, port);   
  19.          try  {   
  20.             client.write(stu);   
  21.         }  catch  (IOException e) {   
  22.              // TODO Auto-generated catch block   
  23.             e.printStackTrace();   
  24.         }   
  25.     }   
  26.   
  27.      public   void  write(Object obj)  throws  IOException {   
  28.         SocketChannel channel =  null ;   
  29.          try  {   
  30.             channel = SocketChannel.open( new  InetSocketAddress(hostname, port));   
  31.             ByteBuffer buf = Client.getByteBuffer(obj);   
  32.             channel.write(Client.getByteBuffer(obj));   
  33.             channel.write(Client.getByteBuffer(obj));   
  34.         }  catch  (Exception e) {   
  35.             e.printStackTrace();   
  36.         }  finally  {   
  37.             channel.close();   
  38.         }   
  39.     }   
  40.        
  41.      public   static  ByteBuffer getByteBuffer(Object obj)  throws  IOException   
  42.     {   
  43.         ByteArrayOutputStream bOut =  new  ByteArrayOutputStream();   
  44.         ObjectOutputStream out =  new  ObjectOutputStream(bOut);   
  45.         out.writeObject(obj);   
  46.         out.flush();   
  47.          byte [] arr = bOut.toByteArray();   
  48.         System.out.println( "Object in "  + arr.length +  " bytes" );   
  49.         ByteBuffer bb = ByteBuffer.wrap(arr);   
  50.         out.close();   
  51.            
  52.          return  bb;   
  53.     }   
  54. }  

server端:

java 代码
  1. public   class  Server {   
  2.   
  3.      public   static   void  main(String[] args) {   
  4.         System.out.println( "in server!" );   
  5.         ServerThread server =  new  ServerThread();   
  6.          new  Thread(server).start();   
  7.     }   
  8.   
  9.      static   class  ServerThread  implements  Runnable {   
  10.   
  11.          public   void  run() {   
  12.              try  {   
  13.                 ServerSocketChannel sc = ServerSocketChannel.open();   
  14.   
  15.                 ServerSocket s = sc.socket();   
  16.                 s.bind( new  InetSocketAddress( 8234 ));   
  17.                  while  ( true ) {   
  18.                     Socket incoming = s.accept();   
  19.                     Runnable r =  new  GetObjThread(incoming);   
  20.                     Thread t =  new  Thread(r);   
  21.                     t.start();   
  22.                 }   
  23.             }  catch  (Exception e) {   
  24.                 e.printStackTrace();   
  25.             }   
  26.         }   
  27.     }   
  28.   
  29.      static   class  GetObjThread  implements  Runnable {   
  30.          public  GetObjThread(Socket s) {   
  31.             incoming = s;   
  32.         }   
  33.   
  34.          public   void  run() {   
  35.              try  {   
  36.                 SocketChannel sc = incoming.getChannel();   
  37.                 ByteBuffer bbIn = ByteBuffer.allocate( 1024 );     
  38.                 sc.read(bbIn);   
  39.                    
  40.                 sc.close();   
  41.                 bbIn.flip();   
  42.                 ByteArrayInputStream bIn =  new  ByteArrayInputStream(bbIn   
  43.                         .array());   
  44.                 ObjectInputStream in =  new  ObjectInputStream(bIn);   
  45.                 Student nStu = (Student) in.readObject();   
  46.                 System.out.println( "student id is "  + nStu.getId() +  "/n"   
  47.                         +  "student name is "  + nStu.getName());   
  48.             }  catch  (IOException e) {   
  49.                 e.printStackTrace();   
  50.             }  catch  (ClassNotFoundException e) {   
  51.                 e.printStackTrace();   
  52.             }   
  53.         }   
  54.   
  55.          private  Socket incoming;   
  56.     }   
  57. }  

四:备份一个有用的util class:对象序列化,反序列化(序列化对象转byte[],ByteBuffer, byte[]转object: 

java 代码
  1. public   class  ByteUtil {   
  2.      public   static   byte [] getBytes(Object obj)  throws  IOException   
  3.     {   
  4.         ByteArrayOutputStream bout =  new  ByteArrayOutputStream();   
  5.         ObjectOutputStream out =  new  ObjectOutputStream(bout);   
  6.         out.writeObject(obj);   
  7.         out.flush();   
  8.          byte [] bytes = bout.toByteArray();   
  9.         bout.close();   
  10.         out.close();   
  11.            
  12.          return  bytes;   
  13.     }   
  14.        
  15.      public   static  Object getObject( byte [] bytes)  throws  IOException, ClassNotFoundException   
  16.     {   
  17.            ByteArrayInputStream bi =  new  ByteArrayInputStream(bytes);   
  18.            ObjectInputStream oi =  new  ObjectInputStream(bi);   
  19.            Object obj = oi.readObject();   
  20.            bi.close();   
  21.            oi.close();   
  22.          return  obj;   
  23.     }   
  24.        
  25.      public   static  ByteBuffer getByteBuffer(Object obj)  throws  IOException   
  26.     {   
  27.          byte [] bytes = ByteUtil.getBytes(obj);   
  28.         ByteBuffer buff = ByteBuffer.wrap(bytes);   
  29.            
  30.          return  buff;   
  31.     }   
  32. }  

五:如何通过xml传递Object对象:

可以先把object转成一个byte[]数组,然后用base64编码成一个base64格式的String,放入xml的CDATA中,就可以传了。

接收方,收到该xml后,把CDATA中的String用base64解码为byte[],进而根据四中的方法,还原为object:

java 代码
  1. public   class  Base64 {   
  2.   
  3.      public   static  String getEncodedText( byte [] bytes) {   
  4.   
  5.          try  {   
  6.             BASE64Encoder encoder =  new  BASE64Encoder();   
  7.             String text = encoder.encode(bytes);   
  8.              return  text;           
  9.         }  catch  (Exception e) {   
  10.             e.printStackTrace();   
  11.              return   null ;   
  12.         }          
  13.   
  14.     }   
  15.        
  16.      public   static   byte [] decode(String src)    
  17.     {   
  18.         BASE64Decoder decoder =  new  BASE64Decoder();   
  19.          try  {   
  20.              return  decoder.decodeBuffer(src);   
  21.         }  catch  (IOException e) {   
  22.              // TODO Auto-generated catch block   
  23.             e.printStackTrace();   
  24.              return   null ;   
  25.         }   
  26.     }   
  27.        
  28.      public   static   void  main(String[] args) {   
  29.         String s =  "ly89" ;   
  30.          byte [] bytes = s.getBytes();   
  31.         String  encode = Base64.getEncodedText(bytes);   
  32.         System.out.println( "the encode string is: "  + encode);   
  33.   
  34.          byte [] dbytes = Base64.decode(encode);   
  35.          for  ( int  i =  0 ; i < bytes.length; i++) {   
  36.             System.out.println(dbytes[i]);             
  37.         }   
  38.     }   
  39. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值