Netværks programmering i javaspil
Hej, er godt igang med at lave et spil i java som man kan game over netværk. Folk kan sagtens joine og køre rundt. Men ligepludselig efter noget tid, siger den:java.lang.NullPointerException
at tankzServer.NetvaerksServer$ClientHandler.run(NetvaerksServer.java:113)
som jeg nok skal vise hvad er... Men nogen der ved hvad der kan være galt med det? Prøver at copy paste koden og mærkere stedet som den henviser til med ------------------, Jeg har gjort sådan at klienten sender kommandoer til serveren hvert 100 milisec, så burde ikke være fordi den får for mange kommandoer på en gang. Forstår det ikke :( Plz nogen der kan hjælpe??
netværks serveren:
package tankzServer;
import java.io.*;
import java.net.*;
import java.util.Vector;
public class NetvaerksServer {
private static ServerSocket servSocket;
private static final int PORT = 7777;
private static Vector klienter = new Vector();
private static BufferedReader in;
private static PrintWriter out;
private SpillerTjek[] st = {new SpillerTjek(0,false),
new SpillerTjek(1,false),
new SpillerTjek(2,false),
new SpillerTjek(3,false),
new SpillerTjek(4,false),
new SpillerTjek(5,false),
new SpillerTjek(6,false),
new SpillerTjek(7,false)
};
public NetvaerksServer() {
}
public void sendBeskedTilTraad(Tank tank) {
for (int i = 0; i < klienter.size(); i++) {
ClientHandler h = (ClientHandler) klienter.elementAt(i);
h.sendBesked(tank);
}
}
public void startNetvaerkforbindelsen() throws IOException {
try {
servSocket = new ServerSocket(PORT);
System.out.println("Port er åbnet");
}
catch (IOException ex) {
System.out.println("\nUnable to set up port!");
System.exit(1);
}
do {
Socket client = servSocket.accept();
System.out.println("\nNew client accepted.\n");
for (int i = 0; i < st.length; i++) {
if (!st[i].isOptaget()) {
st[i].setOptaget(true);
ClientHandler handler = new ClientHandler(client,st[i].getSpiller());
klienter.addElement(handler);
handler.start();
System.out.println("Klienten har fået spiller nr: " + st[i].getSpiller());
break;
}
}
}
while (true);
}
private class ClientHandler
extends Thread {
private Socket client;
private BufferedReader in;
private PrintWriter out;
private String besked = "";
private String option = "";
private int spiller= 0;
private int spiller2=0;
private String player="";
private Tank[] tanks = {new Tank(100,100,0,0),
new Tank(200,100,0,1),
new Tank(300,100,0,2),
new Tank(400,100,0,3),
new Tank(500,100,0,4),
new Tank(600,100,0,5),
new Tank(700,100,0,6),
new Tank(800,100,0,7)
};
public ClientHandler() {
}
public ClientHandler(Socket socket, int spilleren) {
client = socket;
this.spiller2 = spilleren;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
out.println("Connected");
out.println(spilleren);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* Run metode som bliver startet af start
*/
public void run() {
try {
do {
option = in.readLine();
System.out.println("spiller: " + spiller2);
---------------------HER!!!-------------------------------
if (option.equals("left")) {
tanks[spiller] = ServerController.getInstance().moveLeft(tanks[spiller2]);
sendBeskedTilTraad(tanks[spiller]);
}
else if (option.equals("right")) {
tanks[spiller] = ServerController.getInstance().moveRight(tanks[spiller2]);
sendBeskedTilTraad(tanks[spiller]);
}
else if (option.equals("up")) {
tanks[spiller] = ServerController.getInstance().moveUp(tanks[spiller2]);
sendBeskedTilTraad(tanks[spiller]);
}
else if (option.equals("down")) {
tanks[spiller] = ServerController.getInstance().moveDown(tanks[spiller2]);
sendBeskedTilTraad(tanks[spiller]);
}
}
while (!besked.equals("QUIT"));
}
catch (IOException ex) {
ex.getStackTrace();
}
finally {
try {
if (client != null) {
System.out.println("Closing down connection...");
st[spiller2].setOptaget(false);
klienter.removeElement(this);
client.close();
System.out.println("size: " + klienter.size());
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
public void sendBesked(Tank tank) {
out.println(tank.getSpiller());
out.println(tank.getAngle());
out.println(tank.getX());
out.println(tank.getY());
out.flush();
}
}
/**
* Singleton
* @return Returnerer den eneste instans af klassen.
*/
public static NetvaerksServer getInstance() {
if (netvaerksServer == null)
netvaerksServer = new NetvaerksServer();
return netvaerksServer;
}
/**
* Singleton, indeholder en instans af sig selv, eller null.
*/
public static NetvaerksServer netvaerksServer = null;
}
Netværks klienten:
package tankz;
import java.io.*;
import java.net.*;
import java.util.Vector;
import java.util.StringTokenizer;
public class NetvaerksKlient {
public NetvaerksKlient() {
}
private static InetAddress host;
private static final int PORT = 7777;
private static String navn = "";
public static Socket link;
private static BufferedReader in;
private static PrintWriter out;
public void connect(String host1) {
String response = "";
try {
host = InetAddress.getByName(host1);
link = new Socket(host, PORT);
in = new BufferedReader(new InputStreamReader(link.getInputStream()));
out = new PrintWriter(link.getOutputStream(), true);
response = in.readLine();
}
catch (IOException ex) {
response = "Not connected";
}
System.out.println("" + response);
if (response.equals("Connected")) {
try {
int spiller = Integer.parseInt(in.readLine());
Controller.getInstance().setSpillerensNr(spiller);
}
catch (Exception ex) {
System.err.println("Fejl i at hente spillerens nr: " + ex.getMessage());
}
ClientThread ct = new ClientThread(link);
ct.start();
}
}
public void disconnect() {
try {
if (link != null) {
out.println("QUIT");
link.close();
System.out.println("Disconnected");
System.exit(1);
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
public void sendBesked(String option, int spiller) {
out.println(option);
out.flush();
}
private class ClientThread
extends Thread {
private Socket client;
private BufferedReader in;
private PrintWriter out;
private String option = "";
private Tank[] tanks = {new Tank(0,0,1,0),
new Tank(100,100,1,1),
new Tank(200,200,1,2),
new Tank(300,300,1,3),
new Tank(400,400,1,4),
new Tank(500,500,1,5),
new Tank(600,600,1,6),
new Tank(700,700,1,7)
};
/**
* Constructor
*/
public ClientThread() {
}
/**
* Constructor
* @param socket
*/
public ClientThread(Socket socket) {
client = socket;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* Run metode i tråden, håndtere alle input fra serveren
*/
public void run() {
while (true) {
try {
int spiller = Integer.parseInt(in.readLine());
tanks[spiller].setAngle(Double.parseDouble(in.readLine()));
tanks[spiller].setX(Integer.parseInt(in.readLine()));
tanks[spiller].setY(Integer.parseInt(in.readLine()));
Controller.getInstance().opdaterTank(tanks[spiller]);
}
catch (Exception ex) {
System.err.println("FEJL!!! " + ex.getMessage());
disconnect();
}
}
}
}
/**
* Singleton
* @return Returnerer den eneste instans af klassen.
*/
public static NetvaerksKlient getInstance() {
if (netvaerksKlient == null)
netvaerksKlient = new NetvaerksKlient();
return netvaerksKlient;
}
/**
* Singleton, indeholder en instans af sig selv, eller null.
*/
public static NetvaerksKlient netvaerksKlient = null;
}
