当前位置: 首页 > 知识库问答 >
问题:

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

蔺宇
2023-03-14

我正在尝试开发一个Java客户机-服务器应用程序,其中多个客户机可以连接到服务器。我为每个传入的客户机启动一个单独的线程,将客户机套接字传递给该线程,然后打开一对流来维护通信。我得到了这个java。伊奥。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();
        }
    }
}

}

共有1个答案

彭建业
2023-03-14

你需要先修复这一点:

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

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

 类似资料:
  • 问题内容: 我的问题是,当它尝试第二次读取对象时,会引发异常: 我第一次发送完全相同的对象消息;但是,当我第二次尝试执行相同的操作时,则会在上面抛出错误。我是否需要重新初始化readObject()方法?我什至打印出了下面一行所接收到的消息对象,它与第一个可以正常工作的实例完全相同。 Object buf = myInput.readObject(); 我假设附加有一些问题,但是附加确实没有用。我

  • 问题内容: 我正在尝试从文件中读取一些对象。该代码在第一次迭代中工作正常,而在第二次迭代中,它给出了StreamCorruptedException。这是我的代码, 以下是例外情况的一部分。在打印之前,将打印此“ 1”(由于输出) 我不知道为什么会这样。在一些论坛帖子中,我发现在编写文件时将其追加到文件中时会发生这种情况。是真的吗?(我在编写阶段附加到文件中)。如果是这样,是否有读取附加文件的正确

  • 我试图发送对象从服务器模块到客户端模块。不幸的是,它抛出错误。有人知道下面的代码有什么问题吗? 来自服务器模块的类 客户端模块中的类看起来相同,但看起来如下所示: 最后一个类,它接受套接字连接:

  • 问题内容: 读取序列化对象时出现错误(java.io.StreamCorruptedException:无效类型代码:00)。这是实现可序列化的类: 这是堆栈跟踪: 有谁知道我如何获得有关该错误的更多信息?还是Java期望哪个对象? 问题答案: 您已经实现了一种递归方法:将实例写入输出流时,它会调用writeObject方法,该方法将写入一个int,然后将该对象写入输出流,再写入一个int,依此类

  • 问题内容: 我在使用jre1.8.0_66运行的代码中遇到了这个奇怪的异常: 什么意思 代码如下: 如果我更改为,异常会消失。 这样做的价值: 如果我从任一类中删除,该异常也将消失。但是如果我在两个类中都添加了另一个等效的接口(例如,或某些自定义接口),则会返回。 问题答案: 每当涉及交集类型并且您使用的方法引用使用的接收器类型不是第一个(第一个类型是在类型擦除之后将保留的类型)时,都会发生此问题

  • 我使用地址簿框架为我的应用程序,我有崩溃的代码。代码如下所示 现在我在车祸报告中发现了这个错误。 事故标识符:C28DCEAD-5DCD-469B-9349-46F59A92B25E CrashReporter密钥:e1b5c8f591e28608a399ebe58d339df84ab3ae52 硬件型号:iPhone3,1 过程: intooch[163] 路径:/var/mobile/Appl