0

申し分なく、Java で単純なマルチプレイヤー ゲームを作成しようとしています。サーバーとクライアントを作成しました。サーバーに正常に接続できますが、1 秒後に切断されるエラーが発生します。

Exception in thread "Thread-3" java.lang.ArrayIndexOutOfBoundsException: 1769152617
    at Client.updateCordinates(Client.java:49)
    at Input.run(Client.java:143)
    at java.lang.Thread.run(Unknown Source)

上記は、クライアントから受け取ったエラーです。サーバーにエラーは表示されません。

クライアント側のコード:

import java.applet.*;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

@SuppressWarnings("unused")
public class Client extends Applet implements Runnable, KeyListener{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    static Socket socket;
    static DataInputStream in;
    static DataOutputStream out;
    int playerid;

    int[] x = new int [10];
    int[] y = new int [10];

    boolean left,down,right,up;

    int playerx;
    int playery;
    public void init(){
        setSize(100,100);
        addKeyListener(this);
        try{
        System.out.println("Connecting...");
        socket = new Socket("localhost",7777);
        System.out.println("Connection successful.");
        in = new DataInputStream(socket.getInputStream());
        playerid = in.readInt();
        out = new DataOutputStream(socket.getOutputStream());
        Input input = new Input(in,this);
        Thread thread = new Thread(input);
        thread.start();
        Thread thread2 = new Thread(this);
        thread2.start();
    }catch(Exception e){
        System.out.println("Unable to start client");
    }
    }
    public void updateCordinates(int pid, int x2, int y2){
        this.x[pid] = x2;
        this.y[pid] = y2;

    }
    public void paint(Graphics g){
        for (int i=0; i <10;i++){
        g.drawOval(x[i], y[i], 5, 5);
    }

    }
    public void run(){
            while(true){
                if(right == true){
                    playerx += 10;

                }
                if(left == true){
                    playerx -= 10;

                }
                if(up == true){
                    playery += 10;

                }
                if(down == true){
                    playery -= 10;

                }
                if(right||left||up||down){
                    try{
                    out.writeInt(playerid);
                    out.writeInt(playerx);
                    out.writeInt(playery);
                }catch(Exception e){System.out.println("Error sending cordinates");

                }
                }
                repaint();
                try{
                Thread.sleep(400);
            }catch(InterruptedException e){
                e.printStackTrace();

            }
            }
        }
    public void keyPressed(KeyEvent e){
            if (e.getKeyCode() == 37){
                left = true;
            }
            if (e.getKeyCode() == 38){
                up = true;
            }
            if (e.getKeyCode() == 39){
                right = true;
            }
            if (e.getKeyCode() == 40){
                down = true;
            }

        }
    public void keyReleased(KeyEvent e){
             if (e.getKeyCode() == 37){
                left = false;
            }
            if (e.getKeyCode() == 38){
                up = false;
            }
            if (e.getKeyCode() == 39){
                right = false;
            }
            if (e.getKeyCode() == 40){
                down = false;
            }

        }
    public void keyTyped(KeyEvent e){

        }
}

class Input implements Runnable{
    DataInputStream in;
    Client client;
    public Input(DataInputStream in, Client c){
        this.in = in;
        this.client = c;
    }
    public void run(){
        while(true){
            try {
                int playerid = in.readInt();
                int x = in.readInt();
                int y = in.readInt();
                client.updateCordinates(playerid, x, y);
        }catch(IOException e){
            e.printStackTrace();
        }
        }

    }
}

サーバー側コード:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

   static ServerSocket serverSocket;
   static Socket socket;
   static DataOutputStream out;
   static Users[] user = new Users[10];
   static DataInputStream in;
   public static void main(String[]args)throws Exception{
       System.out.println("Starting server");
       serverSocket = new ServerSocket(7777);
       System.out.println("Server Started");
       socket = serverSocket.accept();
       for (int i=0; i <10;i++){
       System.out.println("Connection from:"+socket.getInetAddress());
       out = new DataOutputStream(socket.getOutputStream());
       out.writeUTF("This is a of Java sockets");
       System.out.println("Data has been sent.");
       in = new DataInputStream(socket.getInputStream());
       if(user[i]==null){
           user[i] = new Users(out,in,user,i);
       Thread th = new Thread(user[i]);
       th.start();
       break;

    }
    }
    }
}
class Users implements Runnable{
    DataOutputStream out;
    DataInputStream in;
    Users[]user=new Users[10];
    String name;
    int playerid;
    int playeridin;
    int xin;
    int yin;
    public Users(DataOutputStream out, DataInputStream in, Users[] user, int pid){
       this.out = out;
       this.in = in;
       this.user = user;
       this.playerid = pid;

}
public void run(){
    try {
        out.writeInt(playerid);
    }catch (IOException e1){
        System.out.println("Failed to send PlayerID");
    }
    while(true){
        try{
            playeridin = in.readInt();
            xin = in.readInt();
            yin = in.readInt();
            for(int i=0;i<10;i++){
                if (user[i] !=null){
                    user[i].out.writeInt(playeridin);
                    user[i].out.writeInt(xin);
                    user[i].out.writeInt(yin);
        }
    }
}
    catch(IOException e){
        user[playerid] = null;
    }
    }
}
}
4

2 に答える 2

2

あなたが持っている

 int[] x = new int [10];

this.x [pid]を参照すると、x[]のサイズが10であることを意味します。pidの値は何ですか。

10または>10の場合、インデックスは0から始まるため、例外が発生します。あなたの場合は0から9です。

また

forループ内のサーバー側ではこれout.writeUTF("This is a of Java sockets");を行いますが、クライアント側playerid = in.readInt();では整数を取得していないため、これを行います。これは、10を超えるランダムな値を読み取っています。

于 2013-02-07T06:57:12.947 に答える
0

ノア、入力したサンプル入力値を指定できますか?これにより、上記の例外がトリガーされました。これは、それ自体が言う例外として、配列インデックス値が出力されたときにupdatecoordinated(....)関数でクラッシュしたためです。バインドされています(x[]とy[]の配列サイズが10であるため、この場合はインデックス9を超える可能性があります)

于 2013-02-07T07:02:11.660 に答える