【问题标题】:java.net.SocketException: Connection reset when trying to pass an object from a client to a serverjava.net.SocketException:尝试将对象从客户端传递到服务器时连接重置
【发布时间】:2019-03-27 00:05:22
【问题描述】:

我试图通过客户端通过ObjectOutputStream类传递一个对象,通过ObjectInputStream接收,问题是出现java.net.SocketException: Connection reset错误,消除了客户端和服务器之间对象的这种过去,问题是它解决了,但我不知道错误是什么。

之前我在服务器上有客户端代码时可以正常工作,反之亦然,但现在我更改了这些代码部分并不想工作。在这些行中,此错误在模块服务器上跳转:

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Computer c = (Computer) ois.readObject();

客户

private void startClient() {
    DataInputStream in = null;
    DataOutputStream out = null;
    Socket socket = null;
    try {

        socket = new Socket(ip, port);

        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
        //MANDAMOS EL NUMERO EN RANGO HACIA LOS SERVIDORES
        out.writeInt(n);
        out.flush();
        //LEEMOS EL TIEMPO ENVIADO POR EL SERVIDOR
        tiempo = in.readLong();
        System.out.println(tiempo);

        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        Computer c = (Computer) ois.readObject();
        synchronized (main) {
            main.add(c);
        }
        ois.close();

    } catch (IOException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            out.close();
            in.close();
            socket.close();
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

服务器

private void startServer(){

    DataOutputStream out = null;
    DataInputStream in = null;
    ServerSocket ss = null;
    try {

        Socket socket = null;
        ss = new ServerSocket(port);
        System.out.println("Esperando conexion");
        socket = ss.accept();
        in = new DataInputStream(socket.getInputStream());
        int n = in.readInt();
        long time = encontrarPrimos(n);
        out = new DataOutputStream(socket.getOutputStream());
        out.writeLong(time);
        out.flush();

        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        Computer c = new Computer(id, Computer.getLocalIp(), time, Computer.getUserDomainSO());
        oos.writeObject(c);

        oos.close();
        in.close();
        out.close();
        socket.close();


    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
    }
}

计算机类

public class Computer implements Serializable{
    private int id;
    private String ip;
    private long time;
    private String userDomain;
    public Computer(int id, String ip, long time, String userDomain) {
        this.id = id;
        this.ip = ip;
        this.time = time;
        this.userDomain = userDomain;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public String getUserDomain() {
        return userDomain;
    }

    public void setUserDomain(String userDomain) {
        this.userDomain = userDomain;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + this.id;
        hash = 59 * hash + Objects.hashCode(this.ip);
        hash = 59 * hash + (int) (this.time ^ (this.time >>> 32));
        hash = 59 * hash + Objects.hashCode(this.userDomain);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Computer other = (Computer) obj;
        if (this.id != other.id) {
            return false;
        }
        if (this.time != other.time) {
            return false;
        }
        if (!Objects.equals(this.ip, other.ip)) {
            return false;
        }
        if (!Objects.equals(this.userDomain, other.userDomain)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Computer{" + "id=" + id + ", ip=" + ip + ", time=" + time + ", userDomain=" + userDomain + '}';
    }

    public static String getLocalIp(){
        try {
            InetAddress localhost = InetAddress.getLocalHost();
            return localhost.getHostAddress().trim();
        } catch (UnknownHostException ex) {
            Logger.getLogger(Computer.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public static String getUserDomainSO() {
        String operatingSystem = System.getProperty("os.name");

        if ("Linux".equals(operatingSystem) || "Mac OS X".equals(operatingSystem)) {
            return System.getProperty("user.name");
        } else if ("Windows".equals(operatingSystem)) {
            return System.getenv("USERDOMAIN");
        } else {
            throw new RuntimeException("Unsupported operating system.");
        }
    }

}

错误是下一个:

java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2663)
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2679)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3156)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:862)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358)
    at Client.startClient(Client.java:71)
    at Client.run(Client.java:44)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 服务器是否抛出异常?比如NotSerializableException之类的? Computer 是什么?它有自定义的writeObject() 方法吗?这里没有足够的信息。注意你的标题是错误的。您正在将对象从服务器传递到客户端。而且您仍然可以使用对象流执行所有 I/O,正如我在此问题的上一个版本中告诉您的那样。
  • 如果我只是用 System.out.println("" + (String) ois.readObject()); ,它工作正常。使用计算机的原因是什么?
  • @TheRoy Computer 类保留了服务器的某些关键变量、服务器的信息等,这样我更容易将这些信息传递给客户端。
  • 结论是必然的。问题出在Computer 类中,就像我最后一次问关于发件人抛出异常的相同问题并且您匆忙删除该问题一样。你还没有发布Computer。再次。所以你的问题是题外话。
  • 计算机类已经在问题中了,即便如此,客户端和服务器都是一样的。

标签: java sockets tcp


【解决方案1】:

我对您的客户端代码做了一些修改,它正在运行。我没有在这里使用计算机对象。相反,我使用了 String cast。

private void startClient() {
    DataInputStream in = null;
    DataOutputStream out = null;
    Socket socket = null;
    try {
        InetAddress host = InetAddress.getLocalHost();
        socket = new Socket(host.getHostName(), 9876);

        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());

        //MANDAMOS EL NUMERO EN RANGO HACIA LOS SERVIDORES
        out.writeInt(1000);
        out.flush();

        //LEEMOS EL TIEMPO ENVIADO POR EL SERVIDOR
        long tiempo = in.readLong();
        System.out.println(tiempo);
        String str;
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        if ((str = (String) ois.readObject()) != null) {
            System.out.println(str);
        }
        ois.close();

    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } finally {
        try {
            out.close();
            in.close();
            socket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

【讨论】:

  • 感谢兄弟的回答。我做了你所做的,即使从服务器传递一个字符串流,但在执行它时,我仍然在客户端传递了同样的错误,在ObjectInputStream ois = new ObjectInputStream (socket.getInputStream ());
  • 我已经发布了对我有用的示例。 bitbucket.org/dsajava/dsajava/src/master/stackoverflow/src/…
  • 我设法纠正了错误,显然这是 JVM 中的错误,我必须完全重新安装 Java 并安装与以前相同的版本。
【解决方案2】:

测试了不同的解决方案,主要的错误不是代码,而是运行客户端的计算机上安装的JVM,所以解决方法是从0开始安装Java,使用之前安装的相同版本。

【讨论】:

  • 废话。服务器抛出异常并在没有关闭套接字的情况下退出,因为你的 finally 块是空的,所以连接被重置,所以你的客户端得到了异常。 JVM 不会导致连接重置。
  • 具体来说,它抛出了java.lang.RuntimeException: Unsupported operating system. at elpapu.Computer.getUserDomainSO(Computer.java:125),因为(在我的例子中)operatingSystem 的值是"Windows 7"。我不知道有任何 Windows 版本为此仅返回 "Windows"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多