简体   繁体   English

通过套接字发送对象

[英]Send object over socket

I'm trying to send a custome object through socket in java. 我正在尝试通过java中的套接字发送一个custome对象。 I know that i need to put class that has object i need to send in same package, have the same serialVersionUID and implement Serializable. 我知道我需要把具有对象的类放在同一个包中,具有相同的serialVersionUID并实现Serializable。 I have already did it but i still can't send object over socket. 我已经做到了,但我仍然无法通过套接字发送对象。 Where did i wrong ? 我哪里错了?
Here is client code: 这是客户端代码:
Class user in client 客户端的类用户

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
}

Code to send object of user class: 用于发送用户类对象的代码:

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

Here is the code of server: 这是服务器的代码:
Code of user class: Exactly the same as user of client ( i copy from client and paste them into server ) 用户类代码:与客户端用户完全相同(我从客户端复制并粘贴到服务器中)
Code of server to recieve user object: 接收用户对象的服务器代码:

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

}

here is stacktrace i recieve ( in the server side ): 这是我收到的stacktrace(在服务器端):

java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:209) at java.net.SocketInputStream.read(SocketInputStream.java:141) at java.net.SocketInputStream.read(SocketInputStream.java:223) at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2296) at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2476) at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2546) at java.io.ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2448) at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1944) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readObject(ObjectIn java.net.SocketException:java.net.SocketInputStream.read(SocketInputStream.java:2014)java.net.SocketInputStream.read(SocketInputStream.java:2014)中的连接重置java.net.SocketInputStream.read(SocketInputStream.java) :223)at java.io.ObjectInputStream $ PeekInputStream.peek(ObjectInputStream.java:2296)at java.io.ObjectInputStream $ BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2476)at java.io.ObjectInputStream $ BlockDataInputStream.refill(ObjectInputStream。 java:2546)at java.io.ObjectInputStream $ BlockDataInputStream.skipBlockData(ObjectInputStream.java:2448)at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1944)at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) )java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)at java.io .ObjectInputStream.readObject(ObjectIn putStream.java:371) at tankserver.Main.main(Main.java:31) BUILD SUCCESSFUL (total time: 8 seconds) putStream.java:371)at tankserver.Main.main(Main.java:31)BUILD SUCCESSFUL(总时间:8秒)

when i try to debug then follow situation happen: when i put break point in client (server run normaly) and run step by step then it work but when i put break point in server ( client run normaly ) and run step by step then it throw exception in line 28 ois = new ObjectInputStream(socket.getInputStream()); 当我尝试调试然后跟随情况发生:当我把断点放在客户端(服务器运行normaly)并一步一步运行然后它工作,但当我把断点在服务器(客户端运行normaly)并一步一步运行然后它在第28行抛出异常ois = new ObjectInputStream(socket.getInputStream());

I know that i need to put class that has object i need to send in same package 我知道我需要把具有对象的类放在同一个包中

No, unless you mean 'same package as itself', which is trivial. 不,除非你的意思是“与自己相同的包装”,这是微不足道的。

have the same serialVersionUID 具有相同的serialVersionUID

Yes. 是。

and implement Serializable. 并实现Serializable。

Yes. 是。

I have already did it but i still can't send object over socket. 我已经做到了,但我仍然无法通过套接字发送对象。 Where did I [go] wrong? 我哪里做错了?

You didn't close the socket properly in the client class, so the connection got reset. 您没有在客户端类中正确关闭套接字,因此连接已重置。 Close the output stream instead of just flushing it. 关闭输出流而不是仅刷新它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM