Java Socket 发送对象

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

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

其实我更倾向用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》这个比较重要,搞了我半天不知道哪里出错,言来是这个。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值