有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

网络Java从数据流切换到对象流

我正在开发一款4人网络扑克游戏。我首先创建一个运行游戏的游戏对象。它创建一个服务器对象。服务器对象产生4个线程,每个线程负责不同的socket连接。然后,游戏对象生成4个玩家对象。每个玩家对象都有关于玩家的数据,但现在我只存储他们的输入和输出对象。播放器对象分别创建一个OFCTable,并向它们传递输入和输出连接信息。OFCTable对象是我的客户机。它们连接到服务器并来回发送信息。当我使用DataInputObjects/DataOutputObjects时,这个例子是有效的,但现在我已经将它们切换到了ObjectInputObjects/ObjectOutputObjects,它产生了我的两个客户机(OFCTable),然后抛出和AC异常。我知道我发送数据的方式有很多问题,我想在我能够发送对象之后解决这个问题。我已经尝试过在输入对象之前创建输出对象,但它给出了相同的错误。谢谢你的帮助

输出:

Starting server...
Connecting...
Server Started...
Connection successful
Connection from:/127.0.0.1
Connecting...
Connection successful
Connection from:/127.0.0.1
Connection from:/127.0.0.1
Connecting...
Connection successful
java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.refill(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.read(Unknown Source)
    at java.io.DataInputStream.readUnsignedShort(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readUTF(Unknown Source)
    at java.io.ObjectInputStream.readUTF(Unknown Source)
    at OFCTable.run(OFCTable.java:785)
    at java.lang.Thread.run(Unknown Source)

游戏课 公开课游戏{

    public static void main(String[] args) throws Exception {
        Server server = new Server();       
        Thread thread = new Thread(server); 
        thread.start();
        Player[] Players = new Player[4];
        for(int i=0; i<4; i++ )
            Players[i] = new Player(i+1);

    }

}

服务器类

public class Server  implements Runnable{
static ServerSocket serverSocket;
static Socket socket;
static ObjectOutputStream out;
static ObjectInputStream in;
static Users[] user = new Users[4];

public Server() throws Exception{
}


public void run() {
        System.out.println("Starting server...");
    try {
        serverSocket= new ServerSocket(7777);

    System.out.println("Server Started...");
    while(true){
    socket = serverSocket.accept(); 
    for(int i =0;i<4;i++){
        System.out.println("Connection from:" +socket.getInetAddress());
        out = new ObjectOutputStream(socket.getOutputStream());
        in = new ObjectInputStream(socket.getInputStream());
        if(user[i]==null){
            user[i]=new Users(out,in,user,i+1);
            Thread thread = new Thread(user[i]);
            thread.start();
            break;  
        }

    }
    }
        } catch (IOException e) {       
        e.printStackTrace();
    }
}

}

class Users implements Runnable{

    static private Deck cards = new Deck();
    ObjectOutputStream out;
    ObjectInputStream in;
    Users[] user = new Users[4];
    int Player; 
    public Users(ObjectOutputStream out, ObjectInputStream in,Users[] user,int Player){
        this.out = out;
        this.in = in;
        this.user = user;
        this.Player = Player;
        cards.Shuffle();
    }

    public void run(){
        while(true){             
            try {
            String message = in.readUTF();          
             switch (message) {
            case "1":
                message = in.readUTF();
                for(int i=0;i<4;i++){
                    if(user[i]!=null){
                        user[i].out.writeUTF("View");
                        user[i].out.writeUTF(message);
                    }                   
                }
                cards.Draw();
                message = cards.getCurrent().toString();            
            break;
            case "2":
                message = "updatenow";              
            break;      
            case "Player":
                message = "Player";
                in.readUTF();
                message = "" + Player;              
            break;
            case "CC":
                message = "CC";
            for(int i=0;i<4;i++){
                    if(user[i]!=null){
                        user[i].out.writeUTF(message);                      
                    }

                }               
                message = cards.getCurrent().toString();                
            break;      
            default: 
            break;
            }           
                for(int i=0;i<4;i++){
                    if(user[i]!=null){                      
                        user[i].out.writeUTF(message);                      
                    }

                }

            } catch (IOException e) {
            e.printStackTrace();
            this.in = null;
            this.out = null;
            }

        }


    }
}

球员级别

public class Player {
    Deck deck = new Deck();
    ObjectInputStream in;
    ObjectOutputStream out;    
    Socket socket;
    int Player=0;
       public Player(int play) throws Exception{                
                this.Player = play; 
                System.out.println("Connecting...");
                socket=new Socket("localhost",7777);
                System.out.println("Connection successful");
                //in = new ObjectInputStream(socket.getInputStream());
                //out = new ObjectOutputStream(socket.getOutputStream());
                OFCTable input = new OFCTable(socket,Player);
                Thread thread = new Thread(input);
                thread.start();             

       }   

}

OFCTable类(缩短为仅列出需要知道的信息)

public class OFCTable extends javax.swing.JFrame implements MouseListener, Runnable {
    ObjectInputStream in;
    ObjectOutputStream out;    
    String message;
    String CurrentCard;
    private int Player = 0;
    private int turn = 1; 
       public OFCTable(Socket soc,int play) throws IOException {
           this.in = new ObjectInputStream(soc.getInputStream());
           this.out = new ObjectOutputStream(soc.getOutputStream());
           this.Player = play;
           //this.ObjOut = out;
            initComponents();
            setVisible(true);
            createComponentMap();

        }
    public OFCTable(ObjectInputStream in,ObjectOutputStream out,int play) {
        System.out.println("here"); 
        this.in = in;
        this.out = out;  
        this.Player = play;
        initComponents();
        setVisible(true);
        createComponentMap();

    }


public void run() {
        try {
            out.writeUTF("CC");

        } catch (IOException e1) {          
            e1.printStackTrace();
        }
        while(true){

            try {               
                String message = in.readUTF();              
                 switch (message) {
                case "updatenow":
                    CurrentCard = message;                   
                    Update();
                break;
                case "View":
                    message = in.readUTF();                 
                    setComponentByName(message.split(" ")[1],message.split(" ")[0]);                    
                    message = in.readUTF();
                    CurrentCard = message;
                    turn = (turn + 1) % 5;
                    if (turn == 0) turn = 1;                    
                    Update();
                break;
                case "CC":                                  
                    message = in.readUTF();
                    CurrentCard = message;                   
                    Update();
                break;
                case "Player":                                  
                    message = in.readUTF();
                    CurrentCard = message;                   
                    Update();
                break;
                default:
                    CurrentCard = message;                   
                    Update();                   

                break;
                }               
                } catch (IOException e) {
                    e.printStackTrace();
                    System.exit(1);
                }

        }

    }   

共 (0) 个答案