Java Socket网络传输的序列化机制

Java Socket网络传输如何才能更好的完成自己的任务?下面我们就来看看有关的代码介绍,希望大家有所收获。在网络中的两台机器中传输对象,前提首先是基于同一个平台,这是序列化的基础,所以这里主要有两种做法:


  采用Java <http://developer.51cto.com/art/200512/15883.htm> Socket网络传输的序列化机制,将对象“压扁”成二进制字节,将二进制字节在网络中传输;


  自定义协议,将对象用字符串描述出来,将字符串用二进制表示,在网络中传输,在另外一边用相反的策略解析这个字符串,重新构造业务对象,这个方法能够在异构平台中进行传输而不变形,但是需要额外的编写“压扁”和“充气”的代码;


  我们这里用第一种方法:


  1.package stream.demo;


  2.import java.io.ByteArrayInputStream;


  3.import java.io.ByteArrayOutputStream;


  4.import java.io.File;


  5.import java.io.FileInputStream;


  6.import java.io.FileOutputStream;


  7.import java.io.IOException;


  8.import java.io.InputStream;


  9.import java.io.ObjectInputStream;


  10.import java.io.ObjectOutputStream;


  11.import java.io.OutputStream;


  12.import java.util.Date;


  13.public class Persistence {


  14.public static void main(String[] args) {


  15.byte[] bs = Persistence.toBytes();


  16.//在网络中进行传输


  17.Persistence.getBytes(bs);


  18.}


  19.public static byte[] toBytes() {


  20.Person p = new Person();


  21.p.setName("corey");


  22.p.setTall(171);


  23.p.setBirthday(new Date());


  24.p.setAddress(new Address("yiyang", "ziyang"));


  25.ByteArrayOutputStream out = new


  ByteArrayOutputStream();


  26.try {


  27.ObjectOutputStream oout = new ObjectOutputStream(out); 
   
    28.oout.writeObject(p);


  29.} catch (IOException e) {


  30.// TODO Auto-generated catch block


  31.e.printStackTrace();


  32.}


  33.return out.toByteArray();


  34.}


  35.public static void getBytes(byte[] bs) {


  36.try {


  37.ByteArrayInputStream byteIn = new


  ByteArrayInputStream(bs);


  38.ObjectInputStream in = new ObjectInputStream(byteIn);


  39.Person p = (Person) in.readObject();


  40.System.out.println(p.getName());


  41.System.out.println(p.getTall());


  42.System.out.println(p.getBirthday());


  43.System.out.println(p.getAddress().getCity());


  44.System.out.print(p.getAddress().getStreet());


  45.} catch (Exception e) {


  46.// TODO Auto-generated catch block


  47.e.printStackTrace();


  48.}


  49.}


  50.}


  其中服务端代码片段为:


  51.in = this.getRequestSocket().getInputStream();


  52.out = this.getRequestSocket().getOutputStream();


  53.byte[] bs = Persistence.toBytes();


  54.System.out.println("发送数字长度:"+bs.length);


  55.out.write(bs);


  56.this.getRequestSocket().close();


  57.客户端代码片段为:


  58.InputStream in = request.getInputStream();


  59.byte[] bin = new byte[200];


  60.int length = 0;


  61.while ((length = in.read(bin)) != -1) {


  62.System.out.println("length:" + length);


  63.Persistence.getBytes(bin);


  64.}


  以上就是对Java Socket网络传输的详细介绍,希望大家有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以通过Socket传输对象流,其中涉及到对象的序列化和反序列化。下面是示例代码: 服务端: ```java public class Server { public static void main(String[] args) throws IOException, ClassNotFoundException { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); Socket socket = serverSocket.accept(); System.out.println("客户端已连接"); // 获取输入流 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); // 读取对象 Object obj = ois.readObject(); // 将对象转换为Person类型 Person person = (Person) obj; System.out.println("接收到客户端发送的对象:" + person); // 关闭流和Socket ois.close(); socket.close(); serverSocket.close(); } } ``` 客户端: ```java public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8888); // 创建输出流 ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); // 创建Person对象并写入输出流 Person person = new Person("张三", 18); oos.writeObject(person); // 关闭流和Socket oos.close(); socket.close(); } } ``` 其中Person类需要实现Serializable接口,示例代码如下: ```java public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } ``` 在上面的代码中,服务端和客户端通过Socket建立连接后,服务端通过输入流读取对象,并将对象转换为Person类型,最后输出接收到的对象。客户端创建输出流,将Person对象写入输出流,传输给服务端。注意,在传输对象时,需要将对象转换为字节流,即序列化,以便于网络传输;而在接收对象时,需要将接收到的字节流转换为对象,即反序列化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值