java - 流损坏异常 - 无效代码类型 AC [java]

标签 java multithreading io stream server

我正在尝试开发一个 Java 客户端-服务器应用程序,其中多个客户端可以连接到服务器。我为每个传入客户端启动一个单独的线程,将客户端套接字传递给该线程,然后打开一对流来维持通信。我得到了这个 java.io.StreamCorruptedException - 无效代码类型 AC。

根据我的研究,这意味着我使用新的 ObjectOutputStream 写入现有的 ObjectInputStream。但是,我不太确定如何在我的代码中处理这个问题,尝试了不同的地方进行流初始化,但我仍然无法正确执行。发生异常的行已在客户端代码中标记。我可能对IO流缺乏一些基本的了解。这是我的服务器代码,以及运行客户端连接的线程:

 public class Server {

 public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;

        boolean listeningSocket = true;
        try {
            serverSocket = new ServerSocket(11111);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 11111");
        }

        while(listeningSocket){
            System.out.println("Waiting for a client to connect...");
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected!");
            ConnectThread ct = new ConnectThread(clientSocket);
            ct.start();
            ct.run();
        }
        serverSocket.close();       
    }

}

连接线程:

public class ConnectThread extends Thread{

private Socket socket = null;


public ConnectThread(Socket socket) {

    super("ConnectThread");
    this.socket = socket;

}

@Override
public void run(){
    ObjectOutputStream serverOutputStream = null;
    ObjectInputStream serverInputStream = null;
    try {
        System.out.println("check");
        serverOutputStream = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("check");
        serverInputStream = new ObjectInputStream(socket.getInputStream());
        serverOutputStream.writeInt(42);
        System.out.println("check");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally{
        try {
            serverOutputStream.close();
            serverInputStream.close();              
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
        //implement your methods here

}

和客户端:

public class Client {

public static void main(String[] arg) {


    Socket socketConnection = null;
    ObjectOutputStream clientOutputStream = null;
    ObjectInputStream clientInputStream = null;
            try {

        socketConnection = new Socket("127.0.0.1", 11111);

        clientOutputStream = new ObjectOutputStream(
                socketConnection.getOutputStream());
        clientInputStream = new ObjectInputStream(
                socketConnection.getInputStream());
        System.out.println("check");
        System.out.println(clientInputStream.readInt()); // HERE'S WHERE THE EXCEPTION OCCURS

    } catch (Exception e) {
        System.out.println("The following exception has occured and was caught:");
        System.out.println(e);
    }

    finally{
        try {
            clientOutputStream.close();
            clientInputStream.close();
            socketConnection.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

最佳答案

您需要先修复这一点:

        ConnectThread ct = new ConnectThread(clientSocket);
        ct.start();
        ct.run();

你的ConnectThread是线程的子类,一旦你调用start,它将启动一个新线程来执行你的run方法。所以删除 ct.run();并再次检查。最有可能的是,您尝试从同一套接字读取两个线程(接受一个和连接一个),这会导致失败。

关于java - 流损坏异常 - 无效代码类型 AC [java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720985/

相关文章:

java - java中的嵌套类

C++ 条件变量和等待

c# - 多线程批处理队列

c - 我们如何通过键盘端口重新启动

python - 在这种情况下,为什么 Python 比 C++ 快?

json - 如何跳过 JSON 对象流中的 'noise'?

java - 我想从 firebase 数据库获取数据对象,但 db Reference.addValueEventListener 将不会执行

java - java中有什么方法可以将 String[] 转换为 List<AyrrrayList<>> 吗?

java - 大量内存泄漏导致堆大小在大约8秒内从大约64mb变为1.5gb。垃圾收集器有问题吗?

python - Python 中可变数据的重复数据删除/合并