如何在java中使用套接字发送/接收对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27736175/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 04:56:11  来源:igfitidea点击:

how to send/receive Objects using sockets in java

javasocketsserializable

提问by Ismail Addou

When I execute my code in the CMD window, it doesn't work in Client mode, exactly at the line:

当我在 CMD 窗口中执行我的代码时,它在客户端模式下不起作用,正好在行:

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

the program block on this line but don't stop or signal error :

此行上的程序块,但不要停止或发出错误信号:

I have 3 classes: Client, Server, Message

我有 3 个班级:Client, Server,Message

ClientClass:

客户端类:

package client;

// Organize imports     

public class Client {
    public static void main(String[] args) throws UnknownHostException,
            IOException, ClassNotFoundException {
        System.out.println("welcome client");
        Socket socket = new Socket("localhost", 4444);
        System.out.println("Client connected");
        ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("Ok");
        Message message = new Message(new Integer(15), new Integer(32));
        os.writeObject(message);
        System.out.println("Envoi des informations au serveur ...");

        ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
        Message returnMessage = (Message) is.readObject();
        System.out.println("return Message is=" + returnMessage);
        socket.close();
    }
}

Server

服务器

Here is the code of the Serverclass

这是Server类的代码

package Sockets;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static final int port = 4444;
    private ServerSocket ss = null;

    public void  runServer() throws IOException, ClassNotFoundException{
        ss = new ServerSocket(port);
        System.out.println("le systeme est pret pour accepter les connexions");
        Socket socket = ss.accept();
        ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());

        Message m = (Message) is.readObject();
        doSomething(m);

        os.writeObject(m);
        socket.close(); 
    }

    private void doSomething(Message m) {
        m.setResult(new Integer(m.getA().intValue()*m.getB().intValue()));
    }

    public static void main(String[] args) throws ClassNotFoundException, IOException {
        new Server().runServer();
    }
}

Message

信息

And here is my object , I made it Serializableby implementing the interface Serializable

这是我的对象,我是Serializable通过实现接口来实现的Serializable

import java.io.Serializable;

public class Message implements Serializable {
    private static final long serialVersionUID = -5399605122490343339L;

    private Integer A;
    private Integer B;
    private Integer Result; 

    public Message(Integer firstNumber, Integer secondNumber ){
        this.A = firstNumber; 
        this.B = secondNumber;
    }

    public Integer getA() {
        return A;
    }

    public Integer getB() {
        return B;
    }

    public void setResult(Integer X)  {
        Result = X;
    }
}

采纳答案by user207421

You need to create the ObjectOutputStreambefore the ObjectInputStream, at both ends, for reasons described in the Javadoc concerning the object stream header.

由于 Javadoc 中描述的有关对象流标头的原因,您需要ObjectOutputStreamObjectInputStream, 两端之前创建。