Java 通过套接字发送对象

Java 通过套接字发送对象,java,objectoutputstream,Java,Objectoutputstream,我正试图通过java中的套接字发送一个custome对象。我知道我需要将具有我需要发送的对象的类放在同一个包中,具有相同的serialVersionUID并实现Serializable。我已经这么做了,但仍然无法通过套接字发送对象。我哪里做错了? 以下是客户端代码: 客户端中的类用户 package data; import java.io.Serializable; public class User implements Serializable { /** *

我正试图通过java中的套接字发送一个custome对象。我知道我需要将具有我需要发送的对象的类放在同一个包中,具有相同的serialVersionUID并实现Serializable。我已经这么做了,但仍然无法通过套接字发送对象。我哪里做错了?
以下是客户端代码:
客户端中的类用户

package data;
import java.io.Serializable;

public class User implements Serializable {

    /**
     * 
     */
    public static final long serialVersionUID = 1L;
    private String username = null;
    private String hashedPassword = null;
    private Integer code = null;
    private String from = null;
    private String to = null;
    private Object data = null;

    public User() {

    }

    public User(Integer code) {
        this.code = code;
    }

    public User(Integer code, Object data) {
        this.code = code;
        this.data = data;
    }

    public User(String username, String hashedPassword, Integer code, String from, String to, Object data) {
        this.username = username;
        this.hashedPassword = hashedPassword;
        this.code = code;
        this.from = from;
        this.to = to;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }
    // other getters and setters
}
发送用户类对象的代码:

package tankclient;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import data.*;

public class Main {
    public static void main(String args[]) {
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        boolean isConnected = false;
        String ipServer = "localhost";
        int portServer = 4444;
        try {
            // Print("connecting to server...");
            socket = new Socket(ipServer, portServer);
            isConnected = true;
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            oos.writeObject(new User());
            // Print("connect server success");
        } catch (Exception ex) {
            isConnected = false;
            ex.printStackTrace();
        }
        // DataTransfer transfer = new DataTransfer();
        // //transfer.SendDataRequest(new DataRequest(3));
        // transfer.TestSend();
    }
}
这是服务器的代码:
用户类代码:与客户端用户完全相同(我从客户端复制并粘贴到服务器中)
接收用户对象的服务器代码:

package tankserver;

import data.*;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {

    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        boolean isConnected = false;
        int portServer = 4444;
        try {
            System.out.println("waiting for client to connect ...");
            serverSocket = new ServerSocket(portServer);
            socket = serverSocket.accept();
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            isConnected = true;
            System.out.println("connected");
            User obj = (User) ois.readObject();
            System.out.println(obj.toString());
        } catch (Exception ex) {
            isConnected = false;
            ex.printStackTrace();
        }
        //DataTransfer transfer = new DataTransfer();

        //transfer.GetDataRequest();
        //transfer.TestRecieve();
    }

}
下面是stacktrace i Receive(在服务器端):

java.net.SocketException:在 java.net.SocketInputStream.read(SocketInputStream.java:209)位于 java.net.SocketInputStream.read(SocketInputStream.java:141)位于 java.net.SocketInputStream.read(SocketInputStream.java:223)位于 ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2296) 在 ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2476) 在 ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2546) 在 ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2448) 在 skipCustomData(ObjectInputStream.java:1944) 在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) 在 java.io.ObjectInputStream.ReadOrderinaryObject(ObjectInputStream.java:1774) 位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 在tankserver.Main.Main(Main.java:31)上,构建成功(总时间:8 秒)

当我尝试调试时,会出现以下情况:当我将断点放在客户端(服务器正常运行)并逐步运行时,它会工作,但当我将断点放在服务器(客户端正常运行)并逐步运行时,它会在第28行抛出异常ois=newObjectInputStream(socket.getInputStream())

我知道我需要把那个些有我需要发送的对象的类放在同一个包中

不,除非你的意思是“和它本身一样的包”,这是微不足道的

具有相同的SerialVersionId

并实现可序列化

我已经这么做了,但仍然无法通过套接字发送对象。我哪里做错了


您没有在客户端类中正确关闭套接字,因此连接被重置。关闭输出流,而不是仅仅刷新它。

“连接重置”通常表示存在网络问题。感谢您发布完整的可编译示例。我使用了您的代码并在Eclipse中运行了它,它在运行时没有抛出任何异常。有关您的网络配置的某些内容正在妨碍您。您尝试过在调试器中单步执行代码吗?@Wyzard它通常表示应用程序协议有问题。@JimGarrison我没有这样做,但当我使用String类而不是user类时,它会工作,所以我认为这不是网络问题。我将尝试调试。谢谢:)哦,奇怪:当我把断点放在客户端(服务器正常运行)并一步一步地运行时,它就工作了,但当我把断点放在服务器(客户端正常运行)并一步一步地运行时,我在第28行抛出异常ois=newObjectInputStream(socket.getInputStream())@JimGarrison你知道为什么吗?当客户端结束时,套接字将关闭。代码在Eclipse中运行良好,因此其他方面有问题。@JimGarrison没有。这取决于平台。Windows将重置连接。Unixen将正确关闭插座。OP的问题是证据。在您的平台上的Eclipse*中,代码“运行良好”win7@JimGarrison我在Netbeans JDK 1.8 Winfows 7 Pro中失败。如果OP采用这种方法,他会为OP工作。真奇怪。