java socket发送json_Java中使用Socket发送Java对象实例

这篇博客记录了如何使用Java的Socket进行对象的发送和接收。通过实现Serializable接口,客户端创建User对象并发送到服务器,服务器端接收到对象后进行打印。文章强调了实体类需实现Serializable接口,发送后调用flush()方法,以及确保类的完全限定名在两端一致的重要性。
摘要由CSDN通过智能技术生成

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

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

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

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

38a8fdea9d85d12c5c220428422d717b.png

上面是整体架构。

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();

}

}

}

运行结果:

d90b7d9131825fe6949d1367ee6458f5.png

要注意的地方:

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值