Java Socket 发送对象

来源:互联网 发布:淘宝卖家号被冻结 编辑:程序博客网 时间:2024/05/16 01:17

以前写聊天程序都是用字符串加个标志就直接发送到服务器,然后转发了。

现在要求我用对象流直接发送对象,测试了一下,记录一下。

其实我更倾向用json发送对象的,json说白了也是字符串,等有空了好好研究研究。

主要功能:客户端给服务器发送个对象,服务器接收到了打印出来。反过来是差不多了,就不写了。

上面是整体架构。

User类就两个属性。

package com.qiantu.bean;import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = 1L;private String name;private String 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;}}

服务器端:接收客户端发送过来的user对象:

package test;import java.io.BufferedInputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.net.ServerSocket;import java.net.Socket;import com.qiantu.bean.User;public class TestServer {public void start() {try {ServerSocket ss = new ServerSocket(7777);System.out.println("start to accept...");Socket socket = ss.accept();//建立输入流ObjectInputStream ois = new ObjectInputStream(            new BufferedInputStream(socket.getInputStream()));              Object obj = ois.readObject();              if (obj != null) {                  User user = (User)obj;//把接收到的对象转化为user                System.out.println("user: " + user.getName());                  System.out.println("password: " + user.getPassword());            }              ois.close();            socket.close();            ss.close();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}public static void main(String[] args) {new TestServer().start();}}


客户端:给服务器端发送user对象:

package client;import java.io.IOException;import java.io.ObjectOutputStream;import java.net.Socket;import java.net.UnknownHostException;import com.qiantu.bean.User;public class TestClient {public static void main(String[] args) {new TestClient().start();}public void start() {try {Socket socket = new Socket("127.0.0.1", 7777);//建立输入流ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());User user = new User();user.setName("梁国俏");user.setPassword("123456");//输入对象, 一定要flush() oos.writeObject(user);oos.flush();oos.close();socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}


运行结果:

 

要注意的地方:

《1》实体类要实现Serializable类,添加标识serialVersionUID。

《2》发送对象之后要flush();

《3》这个比较重要,搞了我半天不知道哪里出错,言来是这个。

服务器端和客户端两边的实体类要一模一样,类名一样,包名也要一样。我就是因为包名不一样搞了很久。。。。

原创粉丝点击