java Socket编程——对象传输之起始篇<一>

    计算机主要功能在于抽象日常生活元素为计算机能识别的数据结构,数据结构的实现过程终将形成了有一定规律的步骤,这种有一定规律的步骤通常叫做算法逻辑或解决问题的逻辑模式。Java中将生活元素封装起来的对象是类,类的实例是将类加载到内存中并分配了内存地址而成为类对象(通称对象实例或实例对象)。类是Java虚拟机中最小的执行单元,是八个基本数据类型组成的集合。网络交互中对象的交互是基础,对象传输尤其彰显其重要性和具备的强大的功能。
    所谓对象的传输就是网络中一个或多个节点进程承载交互信息的是Java定义的任何类,当在某个节点调用该类的方法时,其它进程可以接收到该类执行的结果,从而达到同一进程或不同进程之间交互的目的。
    Java中想要在网络两端传输对象,该对象必须是可序列化的,而一个对象要是可序列化的,必须实现Serializable或Externalizable接口,还使用transien关键字标示对象的字段域的某个特定字段不能序列化,所谓不能序列化就是该字段在对象序列化过程中不在存储或网络传输的流中可见。(关于Java序列化更详细内容,是另一个主题,这里不赘述)
    这一节先从简单的示例开始。
   
    1.可序列化的类
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String name; 
    private String password; 
 
    public User() { 
         
    } 
     
    public User(String name, String password) { 
        this.name = name; 
        this.password = password; 
    } 
     
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public String getPassword() { 
        return password; 
    } 
 
    public void setPassword(String password) { 
        this.password = password; 
    } 
}
    这是简单的POJO--User类并让其实现了Serializable接口。
    2.服务器端代码
public class ServerPoint {

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
               //开启服务
ServerSocket server = new ServerSocket(8080);
               //构造User对象并调用User对象的setter方法
User user = new User();
user.setName("ServerPoint");
user.setPassword("server@123456");
                //输入流,以读取Client的输入
InputStream ins= null;
                //缓存输入流,将输入流缓存起来以防Client输出流关闭
BufferedInputStream buffins = null;
               //输出流,向连接本服务器的Client输出数据
OutputStream out= null;
               //对象序列化的输出流
ObjectOutputStream objout= null;
               //对象序列化的输入流
ObjectInputStream objins = null;
               //服务器端等待连接的Socket
Socket socket = null;
               //输出提示信息
System.out.println("Server is starting, waiting for accept.");
while(true){
socket = server.accept();
out = socket.getOutputStream();
objout = new ObjectOutputStream(out);
objout.writeObject(user);
ins = socket.getInputStream();
//这里使用Buffer是个技巧,JDK7后,IO流都实现了Closeable接口,只有Buffer了才能拿到已经关闭输出流的Client写入的数据
buffins = new BufferedInputStream(ins);
objins = new ObjectInputStream(buffins);
    user = (User) objins.readObject();
System.out.println(user.getName());
System.out.println(user.getPassword());

}

}

}
   
    3.Client端代码
public class ClientPoint {

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Socket socket = new Socket("192.168.1.109",8080);
User user = new User();
user.setName("Tom");
user.setPassword("12345678");
InputStream ins= null;
BufferedInputStream buffins = null;
OutputStream out= null;
ObjectOutputStream objout= null;
ObjectInputStream objins = null;

out = socket.getOutputStream();
objout = new ObjectOutputStream(out);
objout.writeObject(user);

ins = socket.getInputStream();
buffins = new BufferedInputStream(ins);
objins = new ObjectInputStream(buffins);
user = (User) objins.readObject();
System.out.println(user.getName());
System.out.println(user.getPassword());

}

}
    4.程序运行结果
    a.服务器端输出



    b.client端输出



    5.总结
    对象传输是面向服务两端很重要的一方面,无论是实现了Serializable的POJO还是JSON或者XML都是必须经过序列化后才能在服务两端进行传输和交互。
   Socket编程是面向服务的基础,而Socket编程的基础是服务和服务使用者之间的交互,Java中服务交互的两端的消息载体就是对象,通常是POJO对象。

猜你喜欢

转载自yogreen.iteye.com/blog/2373313