java - 通过流为我的项目发送对象不起作用,套接字已关闭

标签 java networking stream

服务器:

public Server() throws IOException {
    socket = new ServerSocket(PORT);
    while (true) {
        Socket client = socket.accept();
        Spooker.get().getWindow().append(client.getInetAddress().getHostAddress() + " has connected.");
        if (inetAddrFound(client.getInetAddress().getHostName())) {
            System.out.println("Address found.");
            Thread thread = new Thread(new SpookerClient(client));
            threads.put(client, thread);
            thread.start();
        }

    }

}

private class SpookerClient implements Runnable {

    Socket sock;
    ObjectInputStream ois;
    ObjectOutputStream oos;

    public SpookerClient(Socket socket) {
        System.out.println("Creating Spooker client.");
        this.sock = socket;
        try {
            this.oos = new ObjectOutputStream(socket.getOutputStream());
            oos.flush();
            this.ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        Client client;
        try {
            Spooker.get().getWindow().append("Finding object.");
            System.out.println("Finding object.");
            while ((client = (Client) ois.readObject()) != null && !Thread.currentThread().isInterrupted()) {
                System.out.println("Object found.");
                Spooker.get().getWindow().append("Object found.");
                if (keyFound(client.getKEY()) && idFound(client.getID())) {
                    Spooker.get().getWindow().append("Writing object.");
                    System.out.println("Writing object.");
                    oos = new ObjectOutputStream(sock.getOutputStream());
                    oos.writeObject(Spooker.get().getConfiguration());
                    oos.flush();
                    threads.remove(sock);
                    Thread.currentThread().interrupt();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端:

public ClientConnection() {
    try {
        socket = new Socket(decode(ADDR), Integer.parseInt(decode(PORT)));
        oos = new ObjectOutputStream(socket.getOutputStream());
        ois = new ObjectInputStream(socket.getInputStream());
        oos.writeObject(new Client());
        oos.flush();
        oos.close();
        Thread thread = new Thread(new IncomingSpookerConfiguration());
        thread.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private class IncomingSpookerConfiguration implements Runnable {

    SpookerConfiguration configuration;

    @Override
    public void run() {
        System.out.println("Trying..");
        try {
            while ((configuration = (SpookerConfiguration) ois.readObject()) != null && !Thread.currentThread().isInterrupted() && Spooker.get().getConfiguration() == null) {
                System.out.println("Configuration loaded.");
                Spooker.get().setConfiguration((SpookerConfiguration) ois.readObject());
                Thread.currentThread().interrupt();
                System.out.println(Spooker.get().getConfiguration().getX());
                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我得到的错误是套接字已关闭。我不明白为什么。

我要做的就是这个;

客户端向服务器发送一个包含唯一标识符(CPUID,也为 found here )的 Client 类。服务器检查客户端是否已注册 - 例如如果他们的 cpuid 在数据库上。

如果 cpuid 在数据库上,服务器会发回一个“SpookerConfiguration”类,它本质上是一个包含客户端将用于创建 GUI 的值的类(例如大小、标题、默认关闭操作等)。 ).

我做错了什么?

编辑:

    Client error:

Trying..
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:224)
at java.io.ObjectInputStream$PeekInputStream.peek
(ObjectInputStream.java:2584)
at java.io.ObjectInputStream$BlockDataInputStream.peek
(ObjectInputStream.java:2891)
at java.io.ObjectInputStream$BlockDataInputStream.peekByte
(ObjectInputStream.java:2901)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1502)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at com.spooker.connection.ClientConnection$IncomingSpookerConfiguration.run
(ClientConnection.java:50)
at java.lang.Thread.run(Thread.java:745)

服务器错误:

java.net.SocketException: 
Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at  java.io.ObjectOutputStream$BlockDataOutputStream.drain
(ObjectOutputStream.java:1877)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode
(ObjectOutputStream.java:1786)
at java.io.ObjectOutputStream.writeFatalException
(ObjectOutputStream.java:1580)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:351)
at com.spooker.server.Server$SpookerClient.run(Server.java:65)
at java.lang.Thread.run(Thread.java:745)

最佳答案

  1. socket closed 表示关闭了套接字,然后继续使用它。解决方案:不要。

  2. readObject() 不会在流结束时返回 null。它抛出 EOFException。您的读取循环不正确。

  3. 您必须在套接字的生命周期内使用相同的对象流。

关于java - 通过流为我的项目发送对象不起作用,套接字已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42304995/

相关文章:

java - 线程池和 InheritedThreadLocal

java - 使用 SpringMVC 基于注解的配置进行阐述

java - persistence.xml 未添加到耳中

linux - Docker 不会绑定(bind)到地址;说它正在使用,但它没有

c# - 下载写入 ASP .NET C# 响应流的文件

java - 在 jQuery 中动态设置 cookie 的域

Java 机器因 MySQL 结果太大而崩溃。

c++ - 字节顺序何时成为一个因素?

c++ - 从文件中读取和写入 int 对

c# - 如何为 XML 编写 "filter"流包装器?