“java.io.StreamCorruptedException:无效类型代码:AC”-从服务器-客户端java程序运行客户端代码时发现错误[重复]

2023-12-08

好吧,我正在尝试从 XMLParser 读取 .xml 文件,所以基本上我想读取 XML 文件并将其从服务器打印到客户端,但是在运行客户端代码时我得到:

java.io.StreamCorruptedException: invalid type code: AC

客户端代码是:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;

import javax.swing.JComboBox;
import javax.swing.JFrame;

import server.Video;
import server.VideoFile;

@SuppressWarnings("serial")
public class Client extends JFrame{
    Container contentPane;
    @SuppressWarnings("rawtypes")
    JComboBox selectionBox;

    List<Video> video;
    List<VideoFile> videoFile;

    Socket serverSocket;
    String host = "127.0.0.1";
    int port = 1176;
    ObjectInputStream inputFromServer;
    ObjectOutputStream out;

    public Client() throws Exception {
        // line 41 below
            setupGUI();

        System.out.println("Reading the XML File");
        MyXMLReader reader = new MyXMLReader();
        //video = reader.getList("videoList.xml");
        System.out.println("Finished reading");
    }

    public void openSocket() throws UnknownHostException, IOException {
         /** Obtain an address object of the server */
        serverSocket = new Socket("localhost", port);
        System.out.println("Connected to localhost in port: " + port);
        out = new ObjectOutputStream(serverSocket.getOutputStream());
        //out.flush();
        inputFromServer = new ObjectInputStream(serverSocket.getInputStream());

    }

    @SuppressWarnings("unchecked")
    public void getListFromSocket() throws IOException, ClassNotFoundException {
        try{
        video = (List<Video>)inputFromServer.readObject();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        //serverSocket.close();
    }
    public void runClient() throws Exception {

            try {
                openSocket();
                getListFromSocket();
                serverSocket.close();
                setupGUI();
                } catch (UnknownHostException e) {
                System.out.println("Don't know about host : " + host);
                System.exit(-1);
                } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Couldn't open I/O connection : " + host + ":" + port);
                System.exit(-1);
                } catch (ClassNotFoundException e) {
                System.out.println("Class definition not found for incoming object.");
                e.printStackTrace();
                System.exit(-1);
            }

    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private void setupGUI() throws Exception{
        setTitle("A Client");
        setSize(600, 400);
        setVisible(true);
        contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

            runClient();

        // line 105 below
        String [] selectionListData = new String[video.size()];
        for (int i = 0; i < video.size(); i++) {
        selectionListData[i] = video.get(i).getFilename();
        selectionListData[i] = video.get(i).getID();
        selectionListData[i] = video.get(i).getTitle();
        System.out.println(selectionListData);
        }
        selectionBox = new JComboBox(selectionListData);
        selectionBox.setSelectedIndex(0);
        add(selectionBox, BorderLayout.NORTH);
        selectionBox.addActionListener((ActionListener) this);

        validate();
    }

    public void actionPerformed(ActionEvent e) {
        @SuppressWarnings("rawtypes")
        JComboBox comboBox = (JComboBox)e.getSource();
        String selectedTitle = (String)comboBox.getSelectedItem();
        System.out.println("Selected title : " + selectedTitle);
        }


    public static void main(String[] args) throws IOException, Exception {
            // line 127 below
        new Client();

    }

}

完整的错误是:

    Connected to localhost in port: 1176
    java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at client.Client.getListFromSocket(Client.java:61)
    at client.Client.runClient(Client.java:72)
    at client.Client.<init>(Client.java:40)
    at client.Client.main(Client.java:124)

谁能解决这个问题,我确信它很小,但我无法弄清楚。

Thanks

编辑:服务器代码是:

package server;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.lang.*;

@SuppressWarnings("unused")
public class Server extends Thread implements Runnable{
    List<Video> video;
    static String TimeStamp;
    //Socket Declerations
    ServerSocket serverSocket;
    int port = 1176;
    //String host = "localhost";
    Socket clientSocket;
    ObjectOutputStream outputToClient;



    public Server() {
        Thread();
        System.out.println("Reading the XML File");
        MyXMLReader reader = new MyXMLReader();
        //video = reader.getList("videoList.xml");
        System.out.println("Finished reading");
    }

    public void openSockets() throws IOException {
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Socket Connection Established....");
        } catch (IOException e) {
            System.out.println("Could not listen on port : " + port);
            System.exit(-1);
        }
        TimeStamp = new java.util.Date().toString();
        System.out.println("Opened socket on : " + port + ", waiting for client. " + TimeStamp);

        try {
            clientSocket = serverSocket.accept();
            //System.out.println("Sending to Client.....");
            } catch (IOException e) {
            System.out.println("Could not accept client.");
            System.exit(-1);
            }
            outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());
    }
    public void writeToSocket() throws IOException {
        outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());
        outputToClient.writeObject(video);
        System.out.println(outputToClient);
    }

    public void Thread() {
        Thread socketThread;
        socketThread = new Thread("Socket") {
        public void run() {
            try {
                openSockets();
                writeToSocket();
                clientSocket.close();
                serverSocket.close();
            } catch (IOException e) {
                System.out.println("Error on sockets connection.");
                e.printStackTrace();
            }
        }
};
socketThread.start();
}

    public static void main(String[] args) throws IOException {
        new Server();
        //new Thread();


    }

}

编辑:删除重复条目后出现新错误:

Exception in thread "main" java.lang.NullPointerException
    at client.Client.setupGUI(Client.java:105)
    at client.Client.<init>(Client.java:41)
    at client.Client.main(Client.java:127)

您在 Server 类中的同一套接字上双重打开 ObjectOutputStream,这导致特殊标头发送两次。

1: openSockets最后一行outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());

2: writeToSocket第一行outputToClient = new ObjectOutputStream(clientSocket.getOutputStream());

删除您想要的任何一个,它应该可以正常工作。

至于您现在收到的空指针,我有一种感觉,客户端中的视频为空。在您发布的代码中,这是有意义的,因为在服务器中您从未创建视频数组,因此客户端只是接收 null。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“java.io.StreamCorruptedException:无效类型代码:AC”-从服务器-客户端java程序运行客户端代码时发现错误[重复] 的相关文章

随机推荐

  • 谷歌静态地图使用的两个相互矛盾的陈述

    我发现关于 google stati 地图 api 的限制使用的两个相互矛盾的陈述 根据这个链接 每天允许使用 25 000 次 根据这个链接每天允许使用 1000 次 现在我很困惑哪个是正确的 25000 是每个站点的限制 1000 是每
  • jQuery - 将方法应用于多个对象

    我想对许多声明的变量运行相同的方法 例如 说我有 var searchBtn search var signInBtn signin signInBtn removeClass active searchBtn removeClass ac
  • 将经过训练的超正方文件合并为一个

    我在 Mac 上使用最新版本的 Tesseract 我在一个文件夹中有一个 eng traineddata 在另一个文件夹中有一个 eng traineddata 我希望将我的训练数据文件合并到一个大的训练字体文件中 谁能告诉我该怎么做 我
  • C# 中的骨架化 OpenCV

    任何人都可以给我一个例子 说明如何在不使用距离变换的情况下进行骨架化 或者如果您有使用距离跑步变换的骨架化 我有一个用 C 编写的 OpenCV 示例 更多不起作用 cvlib CvDistTransform pimg ref ref ti
  • 在 ListModel 中传递数组

    我想知道如何在 ListModel 中传递数组 好的 在 QML 中我有一个 ListView 我将其设置为ListModel像这样 model ListModel id myList ListElement name card 0 boo
  • pd.get_dummies() 在大级别上缓慢

    我不确定这是否已经是最快的方法 或者我是否这样做效率低下 我想对一个具有 27k 可能级别的特定分类列进行热编码 该列在 2 个不同的数据集中具有不同的值 因此我在使用 get dummies 之前首先组合了级别 def hot encod
  • 使用 ruby​​ 和 sinatra 保存循环构建的 html 文本中的所有用户条目

    我正在创建一个显示表格的网页 每条记录的末尾还有四列 它们是用户可以输入数据的文本字段 当用户点击底部的提交按钮时 我想保存所有文本字段中的所有数据并将其添加到我的表中 如何保存所有文本字段的数据 这是我的代码 h1 Testing Tab
  • 通过 Java 使用 REST API

    我有一个位于远程服务器上的管理 Web 应用程序 这个应用程序是使用 MEAN 堆栈编写的 我有一个连接到 Web 应用程序所需的所有 RESTful 路由的列表 我正在编写一个 Java 客户端应用程序 需要从此管理应用程序发送和接收数据
  • 如何覆盖 UISearchBar 中的取消按钮

    我目前正在使用以下方法来阻止取消按钮项目显示在搜索栏中 我有一个习惯UIButton我想用它来代替 问题是目前内置的取消按钮仍然显示 void searchDisplayControllerDidBeginSearch UISearchDi
  • 如何检查闹钟是否已设置并正在运行

    我有一个接收器 在手机启动后启动 如下所示
  • HttpConnection - javax.microedition,为 getLength() 方法返回 -1

    我正在尝试用 java 编写一个非常简单的移动应用程序 J2ME 这个想法是通过 URL 输入访问网站并将网站内容读入缓冲区 问题就在这里 这对某些 URL 来说效果很好 但对其他 URL 却不起作用 下面的例子 维基百科 工作正常 但是以
  • Java生成在2^48周期内不重复的“随机”数字

    基本上我想生成在很长一段时间内不会重复的随机数 我不想使用序列 例如java使用的LCG synchronized protected int next int bits seed seed 0x5DEECE66DL 0xBL 1L lt
  • 去掉中间的背景,只保留边框

    这可以做到吗 如何让背景中间完全透明 这将使中间部分透明 并且不会对其应用任何内容 https jsfiddle net racsob9v 现在看起来是这样的 我正在尝试这样做 html body height 100 padding 0
  • 当我的 ViewController 嵌入到 UINavigationController 中时,如何对值进行排序?

    我有两个视图控制器 它们通过 segues 来回发送值准备继续方法 这对我来说一直很完美 直到我决定将我的 ViewController 嵌入到导航控制器中 如果您查看下面的方法 您会发现问题是我的目的地视图控制器不再是 ViewContr
  • data.table 非等值连接中的意外行为

    这是后续this问题 其中接受的答案显示了使用匹配练习的示例data table 包括非平等条件 背景 基本设置是我们有DT1包含人员详细信息样本 以及DT2 这是一种主数据库 目的是找出每个人是否DT1匹配至少一项DT2 首先 我们初始化
  • tf.Estimator.train 抛出 as_list() 未在未知 TensorShape 上定义

    我创建了一个自定义input func并将 keras 模型转换为tf Estimator为了训练 但是 它一直给我带来错误 这是我的模型摘要 我试图设置Input层与batch shape 16 320 320 3 进行测试 但问题仍然存
  • “.addEventListener 不是函数”为什么会出现此错误?

    我收到 addEventListener 不是函数 错误 我被困在这一点上 var comment document getElementsByClassName button function showComment var place
  • 在一个 lambda 表达式中收集复杂对象

    我有一个对象列表 首先 我需要按类型对其进行排序 比按面值 最后 总结所有数量 class Coin String type BigInteger faceValue BigInteger quantity List
  • 使用元类模拟 Gradle project.exec {...}

    作为测试 Gradle 插件的一部分 我想删除一个 groovy 方法 project exec 这是为了确认它正在进行正确的命令行调用 我正在尝试使用元编程 Project proj ProjectBuilder builder buil
  • “java.io.StreamCorruptedException:无效类型代码:AC”-从服务器-客户端java程序运行客户端代码时发现错误[重复]

    这个问题在这里已经有答案了 好吧 我正在尝试从 XMLParser 读取 xml 文件 所以基本上我想读取 XML 文件并将其从服务器打印到客户端 但是在运行客户端代码时我得到 java io StreamCorruptedExceptio