Java中使用Socket发送Java对象实例
以前写聊天程序都是用字符串加个标志就直接发送到服务器,然后转发了。
现在要求我用对象流直接发送对象,测试了一下,记录一下。
其实我更倾向用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》这个比较重要,搞了我半天不知道哪里出错,言来是这个。
服务器端和客户端两边的实体类要一模一样,类名一样,包名也要一样。我就是因为包名不一样搞了很久。。。。
上一篇:struts2中通过json传值解决乱码问题的实现方法
栏 目:JAVA代码
下一篇:Spring Boot Actuator端点相关原理解析
本文地址:http://www.codeinn.net/misctech/52838.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




