文档章节

JAVA TCP传递对象的基本实现

颖辉小居
 颖辉小居
发布于 2015/12/08 13:55
字数 1026
阅读 69
收藏 0

Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口,不包含任何的方法      如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。      对象序列化过程不仅仅保存单个对象,还能追踪对象内所包含的所有引用,并保存那些对象(这些对象也需实现了Serializable接口)。

要传递对象的引用属性类:

package yh.tcp.server;
import java.io.Serializable;
public class CoordObject implements Serializable{
 private static final long serialVersionUID = 1L;
 private double x;
 private double y;
 public double getX() {
  return x;
 }
 public void setX(double x) {
  this.x = x;
 }
 public double getY() {
  return y;
 }
 public void setY(double y) {
  this.y = y;
 }
 public CoordObject(double x, double y) {
  super();
  this.x = x;
  this.y = y;
 }
 @Override
 public String toString() {
  return "CoordObject [x=" + x + ", y=" + y + "]";
 }
}

 要传递的对象类型:

 package yh.tcp.server;
import java.io.Serializable;
public class PersonObject implements Serializable{
 private static final long serialVersionUID = 1L;
 private String name;
 private int age;
 private CoordObject coord;
 public PersonObject(String name, int age, CoordObject coord) {
  super();
  this.name = name;
  this.age = age;
  this.coord = coord;
 }
 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;
 }
 public CoordObject getCoord() {
  return coord;
 }
 public void setCoord(CoordObject coord) {
  this.coord = coord;
 }
 @Override
 public String toString() {
  return "PersonObject [name=" + name + ", age=" + age + ", coord="
    + coord + "]";
 }
}

服务端:

package yh.tcp.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
 public static void main(String[] args) throws IOException {
  ServerSocket server = null;
  Socket client = null;
  ObjectOutputStream oos = null;
  ObjectInputStream ois = null;
  server = new ServerSocket(8888);
  System.out.println("服务器开启,等待客户端访问……");
  client = server.accept();
 
  
  CoordObject coord=new CoordObject(1.1, 2.2);
  PersonObject person=new PersonObject("name", 123, coord);
  oos=new ObjectOutputStream(client.getOutputStream());
  oos.writeObject(person);
  oos.close();
  client.close();
 }
}

客户端:

package yh.tcp.client;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
 public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
  Socket client = null;
  ObjectInputStream ois=null; 
  client =new Socket("localhost",8888);
  ois=new ObjectInputStream(client.getInputStream());
  Object object=ois.readObject(); 
  System.out.println(object);  
  ois.close();
  client.close();
 }
}

 打印结果:

PersonObject [name=name, age=age, coord=CoordObject [x=1.1, y=2.2]]

以上不具备多次交互,且不支持多线程为多个客户端提供链接的机制。

下面的实例,可以让客户端对服务端序列化的对象进行操作,并且支持多个客户端同时访问。

增加线程类:

 package yh.tcp.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class TcpThread implements Runnable {
 private Socket client;
 public Socket getClient() {
  return client;
 }
 public void setClient(Socket client) {
  this.client = client;
 }
 public TcpThread(Socket client) {
  super();
  this.client = client;
 }
 @Override
 public void run() {
  BufferedReader buf = null;
  ObjectOutputStream oos = null;
  try {
   oos = new ObjectOutputStream(client.getOutputStream());
   buf=new BufferedReader(new InputStreamReader(client.getInputStream()));
   boolean flag=true;
   while (flag) {
    String str=buf.readLine();
    if(str==null||"".equals(str)||"bye".equals(str)){
     flag=false;
    }else {
     CoordObject coord=new CoordObject(121.1, 43.1);
     PersonObject person=new PersonObject(str, 100, coord);
     oos.writeObject(person);
    }
   }
   System.out.println("当前断开一位~");
   oos.close();
   client.close();  
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

 

修改服务端:

 package yh.tcp.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
 public static void main(String[] args) throws IOException {
  ServerSocket server = null;
  Socket client = null;
  server = new ServerSocket(8888);
  boolean flag = true;
  while (flag) {
   System.out.println("服务器开启,等待客户端访问……");
   client = server.accept();
   new Thread(new TcpThread(client)).start();
  }
  server.close();
 }
}

修改客户端:

package yh.tcp.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
 public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
  Socket client = null;
  ObjectInputStream ois=null; 
  PrintStream out=null;
  BufferedReader writeInput=null;
  client =new Socket("localhost",8888);
  
  writeInput=new BufferedReader(new InputStreamReader(System.in));//键盘打印流
  out=new PrintStream(client.getOutputStream());//向服务端输出流
  ois=new ObjectInputStream(client.getInputStream());//从服务端接受的输入流
 
  boolean flag=true;
  while (flag) {
   System.out.println("请输入信息~");
   String str=writeInput.readLine();
   out.println(str);
   if ("".equals(str)||null==str||"bye".equals(str)) {
    flag=false;
   }else {
    Object object=ois.readObject(); 
    System.out.println(object);  
   }
  }
  
  ois.close();
  client.close();
  out.close();
 }
}

 打印结果:对于汉字的序列化反序列化也没出现乱码

 

© 著作权归作者所有

颖辉小居

颖辉小居

粉丝 34
博文 192
码字总数 81226
作品 0
东城
高级程序员
私信 提问
RMI:Java中的分布式计算框架

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实...

qq_39521554
2018/05/15
0
0
java clone方法使用详解

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,特别是先学c、c++后学java的程序员。并且由于Java不能通过简单的赋值来解决对象复制的问...

丁佳辉
2015/08/14
58
0
大神教你JVM运行原理及Stack和Heap的实现过程

Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和...

问题终结者
01/07
61
0
JVM基础:深入学习JVM堆与JVM栈

以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在...

李星
2014/06/04
354
0
用RMI实现基于Java的分布式计算(1)

向您介绍使用RMI实现Java的分布式计算。由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络Java分布式应用的时候,可以用它自身的机制实现分布式计算。 概述 随...

山哥
2012/02/24
527
0

没有更多内容

加载失败,请刷新页面

加载更多

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
17分钟前
3
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
25分钟前
4
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
25分钟前
3
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
36分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部