java - 在 Java 中将不同的对象发送到服务器

标签 java tcp client-server inputstream

我有几个类(class)。 学生、老师和书。

我想将这 3 个对象的实例从服务器发送到连接的客户端。 我知道如何使用以下代码发送/接收单一类型的实例,即学生从服务器到客户端

客户端

            Socket socket = new Socket(ip, port);
        try {
            ObjectInputStream objectInput = new ObjectInputStream(socket.getInputStream());
            try {
                Object object =(Student) objectInput.readObject();
                Student std = (Student) object;
                //do something with std
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }          

服务器端

        Student a = new Student();
        ServerSocket myServerSocket = new ServerSocket(port);
        Socket skt = myServerSocket.accept();   
        try 
        {
            ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream());
            objectOutput.writeObject(a);                
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        } 

如何扩展此代码以能够从服务器发送不同类型的对象并在客户端正确接收它们

我是否需要将它们全部包装在另一个对象中并为每个对象指定一个类型? 谢谢!

最佳答案

Do I need to wrap them all in another object and give each one a type?

  1. 创建一个聚合所有对象实例的类可能是更好的设计。这将防止错误并产生更具可读性的代码。

  2. 如果您只想在客户端和服务器之间交换纯 Java 对象,您最好使用像 Remote method invocation 这样的东西。 (文章中包含示例)。

How to extend this code to be able to send different types of objects from server?

如果你坚持学习套接字,你可以一个接一个地发送和接收对象实例。

您还可以发送对象数组。

客户端示例:

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 6060);

        try {
            ObjectInputStream objectInput = new ObjectInputStream(socket.getInputStream());
            Student student = (Student)objectInput.readObject();

            System.out.println("Received student (" + student + ")");

            objectInput = new ObjectInputStream(socket.getInputStream());
            Teacher teacher  = (Teacher) objectInput.readObject();

            System.out.println("Received teacher (" + teacher + ")");

            //do something with std
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }  finally {
            socket.close();
        }
    }
}

服务器示例:

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket myServerSocket = new ServerSocket(6060);
        System.out.println("Up and running");
        Socket skt = myServerSocket.accept();   
        try {
            Student student = new Student();
            ObjectOutputStream objectOutput = new ObjectOutputStream(skt.getOutputStream());
            objectOutput.writeObject(student);
            System.out.println("Sent student");

            Teacher teacher = new Teacher();
            objectOutput = new ObjectOutputStream(skt.getOutputStream());
            objectOutput.writeObject(teacher);
            System.out.println("Sent teacher");
        } 
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            myServerSocket.close();
        }

        System.out.println("Shutting down");
    }
}

但是这种方法很难理解并且容易出错,因为如果你没有在 ClientServer 上得到正确的顺序,那么这段代码就不会工作。

关于java - 在 Java 中将不同的对象发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26255223/

相关文章:

java - 何时以及如何在我的 Rest Api 中实例化 Spring Bean

java - 如何模拟TCP层?

java - 对我的客户端 Java 程序进行多线程处理

java - 在 Swing 事件中启动线程

java - 为原始类型抛出不一致的 ClassCastException

java - 尝试从 COM 端口读取会使 JVM 崩溃

java - Spring + thymeleaf : time in user's timezone

php - MT4 - 通过 PHP 连接 Mysql

java - 在 Java TCP 中接受多个客户端

sockets - 套接字服务器和逻辑服务器分离