一、前言
关于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:小木人印象