1

我正在为大学开发一个刽子手游戏。它需要通过套接字,带有服务器和客户端。游戏现在运行良好。

但是当它由两个人玩,试图猜测同一个词时,我需要知道一个用户选择了哪个字母,所以我可以在另一个用户 GUI 上禁用该字母。

所以,我正在尝试发送一个带有 id 的字母对象,该 ID 将禁用另一侧的按钮,我首先发送一条消息,警告我将发送一个对象,所以我没有收到异常。

Bur 它只读取我发送的前两个对象,在第三个对象上我得到一个名为java.io.StreamCorruptedException的异常。有谁知道为什么?

    Sending:
    toClient= new DataOutputStream(socketConection.getOutputStream());
    toClient.writeBytes("VK_Letra\n");
    objectToClient= new ObjectOutputStream(socketConetion.getOutputStream());
    objectToClient.writeObject(new Letter());
    objectToClient.flush();

    Receiving:
    fromServer = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
    objectFromServer = new ObjectInputStream(socketCliente.getInputStream());

public void run(){
    String str;
    try{
        while(true){
            str = fromServer.readLine();

            if(str.equals("VK_Letter")){
                Letter l = (Letter) objectFromServer.readObject();
                System.out.println(l.getLetter());
                button[l.getId()].setEnabled(false);
            }else{
                chat.append(str+ "\n");
                chat.setCaretPosition(chat.getDocument().getLength());
            }
        }
    }catch(IOException | ClassNotFoundException e){
        JOptionPane.showMessageDialog(/* Error Message */);
    }
}
4

2 回答 2

1

我将使用的方法是将所有内容都作为对象,以便您只发送和接收对象。然后该对象将指示实际消息以及任何参数或参数或数据。

您在读取行和获取对象之间混淆。

于 2012-09-25T16:57:37.563 回答
1

一个常见的混淆来源是当您在同一个流上混合不同的流类型时。

你有两个不同问题的一个很好的例子。

  • 您不应在同一流上使用多个流,例如 DataOutptuStream 和 ObjectOutputStream
  • 不应混合二进制流和文本流,例如 BufferedReader 和 ObjectInputStream。

解决方案是使用一个,并且只有一个,它适合您的需求并使用它。

于 2012-09-25T16:58:50.847 回答