Java中使用Socket发送Java对象实例

网友投稿 209 2023-08-02


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

  &nAxnDmlELFbsp;         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》这个比较重要,搞了我半天不知道哪里出错,言来是这个。

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:实现无刷新联动例子汇总
下一篇:Java中使用辗转相除法求最大公约数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~