首页

关于java通过Socket实现对象内容网络传递(代码示例)

标签:Socket,套接字,net,对象序列化,Serializable,ObjectOutputStream,ObjectInputStream     发布时间:2015-07-27   

一、前言

关于java实现Socket通信时,需要将对象内容进行封装,然后以对象为单位在网络中进行传递同步。首先需要将对象类实现序列化接口(如何序列化可以参考“对象序列化及反序列化意义及实现方法有哪些”),然后通过jdk提供的对象写入流类ObjectOutputStream或者读取流类ObjectInputStream来实现对象流的写入读取操作。

二、示例代码

1.定义传递消息类,该类对应对象要在网络中进行传递,所以消息类必须实现序列化,具体如下:

import java.io.Serializable;@b@@b@public class Message implements Serializable {@b@    @b@    private String sender;@b@    private String ip;@b@    private String body;@b@    @b@    public String getSender() {@b@        return sender;@b@    }@b@    public void setSender(String sender) {@b@        this.sender = sender;@b@    }@b@    public String getIp() {@b@        return ip;@b@    }@b@    public void setIp(String ip) {@b@        this.ip = ip;@b@    }@b@    public String getBody() {@b@        return body;@b@    }@b@    public void setBody(String body) {@b@        this.body = body;@b@    }@b@    @b@    @Override@b@    public String toString() {@b@        // TODO Auto-generated method stub@b@        return "sender:"+sender+";ip:"+ip+";body:"+body;@b@    }@b@@b@}

2.客户端写入消息对象内容,在客户端程序创建Socket对象后,通过ObjectOutputStream封装Socket输出流,示例代码如下:

import java.io.ObjectOutputStream;@b@import java.net.InetAddress;@b@import java.net.Socket;@b@@b@public class Client {@b@    public static void main(String[] args) throws Exception {@b@        Socket s=new Socket("localhost",8888);@b@        ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());@b@        Message msg=new Message();@b@        //后去客户端主机名@b@        msg.setSender(InetAddress.getLocalHost().getHostName());@b@        //获取客户端ip@b@        msg.setIp(InetAddress.getLocalHost().getHostAddress());@b@        msg.setBody("小木人印象");@b@        oos.writeObject(msg);@b@        oos.flush();@b@        oos.close();@b@    }@b@}

3.服务端通过ServerSocket启动端口服务,然后通过监听客户端连接,通过其Socket的输入流ObjectInputStream获取第2步写入流结果,具体如下:

import java.io.ObjectInputStream;@b@import java.net.ServerSocket;@b@import java.net.Socket;@b@@b@public class Server {@b@@b@    public static void main(String[] args) throws Exception {@b@        ServerSocket ss=new ServerSocket(8888);@b@        System.out.println("测试服务器已经启动,端口8888");@b@        Socket s=ss.accept();@b@        System.out.println("有客户端连接:"+s);@b@        ObjectInputStream ois=new ObjectInputStream(s.getInputStream());@b@        Message msg=(Message)ois.readObject();@b@        System.out.println(msg.toString());@b@        ois.close();@b@        ss.close();@b@    }@b@@b@}

运行结果如下:

测试服务器已经启动,端口8888@b@有客户端连接:Socket[addr=/127.0.0.1,port=50512,localport=8888]@b@sender:air;ip:172.168.1.6;body:小木人印象