我有一个ServerMain和一个ClientMain,它们为客户端和服务器线程提供套接字.然后,我try 使用相同的方法创建对象流,但得到一个错误.

ServerMain的错误:

java.net.SocketException: An established connection was aborted by the software in your host machine
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:325)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2875)
    at java.base/java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2891)
    at java.base/java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3388)
    at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:959)
    at java.base/java.io.ObjectInputStream.<init>(ObjectInputStream.java:397)
    at abstractClass.initializeStreams(abstractClass.java:17)
    at MulServerThread.run(MulServerThread.java:12)

abstractClass

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

public abstract class abstractClass extends Thread {
    protected Socket socket;
    protected ObjectInputStream in;
    protected ObjectOutputStream out;
    protected abstractClass(Socket socket) {
       this.socket = socket;
    }

    protected void initializeStreams() {
        try {
            in = new ObjectInputStream(socket.getInputStream());
            out = new ObjectOutputStream(socket.getOutputStream());

        } catch (IOException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }
    }
}

Client

import java.io.IOException;
import java.net.Socket;

public class ClientMain {

    public static void main(String[] args) {

        try (Socket server = new Socket("localhost", 3141)) {
            Client client = new Client(server);
            client.start();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
import java.net.Socket;

class Client extends abstractClass {
    Client(Socket socket) {
        super(socket);
    }

    @Override
    public void run() {
        initializeStreams();
    }
}

Server

import java.io.IOException;
import java.net.ServerSocket;

public class ServerMain {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(3141);
            MulServerThread mulThread = new MulServerThread(serverSocket.accept());
            mulThread.start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
import java.net.Socket;

class MulServerThread extends abstractClass {

    public MulServerThread(Socket socket) {
        super(socket);
    }

    @Override
    public void run() {
        initializeStreams();
    }
}

它想让我写更多.所以,是的,这是代码的精简版本,所以您不必阅读所有不相关的内容.

推荐答案

持有套接字的主线程不会等待客户端/服务器退出.它只是启动连接,启动客户端/服务器,然后立即结束try(){}块,关闭流.

您应该.join()您创建的线程,以使主线程等待客户端/服务器线程完成,然后再继续,尽管在这一点上我质疑您为什么会有一个新的线程开始.

Java相关问答推荐

将具有多个未知字段的SON映射到Java POJO

@ EnableRouting注释在Kotlin项目中不工作

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

通过移动一个类解决了潜在的StubbingProblem.它怎麽工作?

测试容器无法加载类路径初始化脚本

如何在列表(链表)中插入一个新 node (作为prelast)

X=x*0.90;产生有损转换误差.X*=0.90;不是.为什么?

FETCH类型设置为LAZY,但它仍会发送第二个请求

将stringBuilder + forloop转换为stream + map

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

为什么这种递归会有这样的行为?

OAuth:登录后无法查看Google邮箱地址

控制器建议异常处理

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

如何从指定某些字段的父对象创建子对象

URI构造函数错误?

java.util.LinkedList()是如何成为MutableList的实例的?