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

java.io.StreamCorruptedException:无效的流头:70707070

万俟超
2023-03-14

所以我见过很多不同的问题,但没有明确的帮助,至少对我的理解或我的个人应用。我正在制作一个套接字“聊天室”程序,允许用户通过中央服务器发送图像给选定的用户。我可以建立要连接的客户端,但当发送映像时,会出现此错误。下面是我的代码

客户:

    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                s = new Socket("localhost", 4000);

                while (s.isConnected()) {
                    oos = new ObjectOutputStream(s.getOutputStream());
                    if (!initialized) {
                        oos.writeObject(identity);
                        oos.flush();
                        oos.reset();
                        initialized = true;
                    }
                    baos = new ByteArrayOutputStream(1000);
                    // Take screenshot
                    BufferedImage img = new Robot()
                            .createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

                    // Write img to baos 
                    ImageIO.write(img, "jpg", baos);

                    // Send image over socket
                    oos.writeObject(baos.toByteArray());
                    oos.flush();
                    oos.reset();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    };
    thread.start();

中央服务器主页:

    public Home() {
    initComponents();
    textView = new Terminal(terminal);

    users = new CopyOnWriteArrayList<>();

    Thread startServer = new Thread(new ServerStart());
    startServer.start();
}

public class ServerStart implements Runnable {

    @Override
    public void run() {

        try {
            serverSock = new ServerSocket(4000);

            terminal.append("Server started...\n");

            while (true) {
                // Detect client connection
                Socket clientSock = serverSock.accept();

                Thread thread = new Thread(new ClientHandler(clientSock));
                thread.start();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

public class ClientHandler implements Runnable {

    Socket socket;

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
                User user = new User(socket);
                terminal.append(user.getName() + " connected as " + user.getType() + "...\n");
                if (user.getType().equals(User.TYPE_01)) {
                    users.add(user);
                } else {
                    User client = findUser(user);
                    while(true){
                        user.sendScreen(client.receiveScreen());
                    }
                }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private User findUser(User user) {
        for (User client : users) {
            if (client.getCompany().equals(user.getCompany())) {
                if (client.getName().equals(user.getName())) {
                    return client;
                }
            }
        }
        return null;
    }
}

中央服务器用户:

    public static final String TYPE_00 = "VIEWER";
public static final String TYPE_01 = "CLIENT";

private byte[] bytes;
private ObjectInputStream in;
private ObjectOutputStream out;
private String company, name, type;

public User(Socket socket) throws IOException {
    this.out = new ObjectOutputStream(socket.getOutputStream());
    this.in = new ObjectInputStream(socket.getInputStream());
    setUserType();
}

public void sendScreen(byte[] bytes) {
    try {
        out.writeObject(bytes);
        out.flush();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public byte[] receiveScreen() {
    byte[] bytes = null;
    try {
        bytes = (byte[]) in.readObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bytes;
}

public String getCompany() {
    return company;
}

public String getName() {
    return name;
}

public String getType() {
    return type;
}

public void setUserType()
{
    String[] strings = null;
    try{
        strings = (String[])in.readObject();
        type = strings[0];
        company = strings[1];
        name = strings[2];
    } catch(Exception e){
        e.printStackTrace();
    }
}
    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                Socket s = new Socket("localhost",4000);


                String[] strings = { TYPE, "Vision", "cadams" };


                while (s.isConnected()) {

                    if(!initialized){
                        System.out.println("initialized");
                        oos = new ObjectOutputStream(s.getOutputStream());
                        oos.writeObject(strings);
                        oos.flush();
                        oos.reset();
                        initialized = true;
                    }
                    ois = new ObjectInputStream(s.getInputStream());

                    byte[] bytes = (byte[]) ois.readObject();
                    BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
                    ImageIcon ico = new ImageIcon(
                            img.getScaledInstance(viewer.getWidth(), viewer.getHeight(), Image.SCALE_SMOOTH));
                    viewer.setIcon(ico);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    thread.start();

}

共有1个答案

梁丘安晏
2023-03-14

不要继续创建新的ObjectInput/OutputStreams。在套接字的生命周期内使用相同的对象。

NBwhile(s.isconnected()无效。当对等端断开连接时,它不会神奇地变为false。您需要处理流结束和各种套接字终止异常。

 类似资料:
  • 问题内容: 我有一个使用对象进行通信的客户端服务器应用程序。 当我仅将一个对象从客户端发送到服务器时,一切正常。 当我尝试在同一流上一个接一个地发送多个对象时 有人可以指导我找出此错误的原因吗? 客户端写入方法 服务器读取方法 并且SecMessage类是 问题答案: 如果您要发送多个对象,通常最简单的方法是将它们放入某种持有人/收藏夹,例如or 。它省去了必须显式检查流结束的麻烦,并省去了显式传

  • 问题内容: 我不断得到这个得到这个: 服务器端我用它来发送和接收int,工作正常。 服务器: 客户: 但是,当我尝试像这样发送对象时,就会出现错误。 服务器: 客户: 任何帮助都会很好。这是我在游戏开始之前最初发送填字游戏的时间 根据jtahlborn的建议,我将代码更改为仅使用对象流,而不使用数据流 服务器 客户 问候,C. 问题答案: 不要用多个输入/输出流包装套接字流。这将以各种不良方式打破

  • 问题内容: 我是一名练习File IO技能的学生,遇到使用ObjectInputStream从文件读取对象的问题。代码始终抛出InvalidClassException,但我找不到代码是如何将其在线或通过反复试验将其抛出的。这是我的代码: 我编写了所有单独的catch块,以弄清楚抛出了什么异常,并且该异常总是抛出InvalidClassException。 这也是我的树类: 这是我的写文件功能:

  • 问题内容: 关于如何解决此错误的任何想法?我在Hibernate中使用Spring JPA。下面的必要详细信息。 实体类别1: 用户的实体类: 和stacktrace: stacktrace非常大。我将下面的整个stacktrace粘贴以供参考,并在此处粘贴快速TL; DR: 完整的堆栈跟踪如下: 更新: 我将Ways实体类更新为以下内容,但仍然出现错误: 问题答案: 当无法反序列化某些内容时,就

  • 问题内容: 升级到Django 1.5后,我开始出现如下错误: 我已经 在文件中进行了设置。 这里发生了什么?有人假装成为Google并访问我的网站吗?还是有人错误地设置其HTTP_HOST标头的良性案例? 问题答案: 如果你ALLOWED_HOSTS的设置正确,则可能有人通过欺骗标头来探测你的站点是否存在漏洞。 Django开发人员正在讨论将其从500内部服务器错误更改为400响应

  • 问题内容: 我的节点: 这是我的: 运行成功并且Redis / Nginx安装正确,但是节点实例抛出此错误: 我到处搜索,似乎找不到有效的解决方案。我尝试使用常规设置url:,特别是install 和使用图像。 我已经读到,当人们尝试在OS X(我的OS)上构建了Linux env之后使用bcrypt时,会发生这种情况,但是我认为这不是问题,因为我正在使用docker和boot2docker。 问