Hallo liebes Java-Forum!
Da wir im nächsten Semester ein Client-Server basiertes Spiel programmieren müssen, wollte ich zum Einstieg versuchen ein Programm zu schreiben, sodass sich bis zu 5 Clients am Server verbinden und ein Viereck in einem Feld bewegen können. (Ohne Kollision oder andere Features)
Da ich in diesem Gebiet ein totaler Anfänger bin, habe ich mich an einem Tutorial orientiert, dies jedoch nicht 1:1 kopiert. Mein erstes Problem ist folgendes: Ich starte den Server (mit Port 8888) und verbinde dann einen Client mit gleichem Port, bekomme jedoch die Exception:"Address already in use: JVM_Bind"
Wenn ich unter der Eingabeaufforderung von Windows netstat -a eingebe, sehe ich jedoch dass dieser Port vorher nicht benutzt wurde, also muss der Fehler im Programm liegen (denke ich).
Es wäre sehr nett, wenn mir jemand meinen Fehler erklären würde, hier sind die Klassen:
und hier die Client-Klasse:
Für eure Hilfe wäre ich sehr dankbar
lieben Gruß!
Da wir im nächsten Semester ein Client-Server basiertes Spiel programmieren müssen, wollte ich zum Einstieg versuchen ein Programm zu schreiben, sodass sich bis zu 5 Clients am Server verbinden und ein Viereck in einem Feld bewegen können. (Ohne Kollision oder andere Features)
Da ich in diesem Gebiet ein totaler Anfänger bin, habe ich mich an einem Tutorial orientiert, dies jedoch nicht 1:1 kopiert. Mein erstes Problem ist folgendes: Ich starte den Server (mit Port 8888) und verbinde dann einen Client mit gleichem Port, bekomme jedoch die Exception:"Address already in use: JVM_Bind"
Wenn ich unter der Eingabeaufforderung von Windows netstat -a eingebe, sehe ich jedoch dass dieser Port vorher nicht benutzt wurde, also muss der Fehler im Programm liegen (denke ich).
Es wäre sehr nett, wenn mir jemand meinen Fehler erklären würde, hier sind die Klassen:
Java:
import java.net.*;
import java.io.*;
public class Server {
static DataInputStream in;
static DataOutputStream out;
static ServerSocket serverSocket;
static Socket socket;
static Player[] players;
public static void main(String[] args) throws Exception {
// starte den server
System.out.println("Starte Server...");
serverSocket = new ServerSocket(8888);
System.out.println("Server gestartet.");
// nehme solange neue clients an, bis 5 verbunden sind
while(true){
Socket socket = serverSocket.accept();
for(int i = 0; i < 5; i++){
if(players[i] == null){
System.out.println("Verbinde mit: " + socket.getInetAddress());
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
players[i] = new Player(out, in, players, i);
Thread th = new Thread(players[i]);
th.start();
break;
}
}
}
}
}
class Player implements Runnable{
DataInputStream in;
DataOutputStream out;
Player[] players = new Player[5];
int playerid;
int playeridin;
int xin;
int yin;
public Player(DataOutputStream out, DataInputStream in, Player[] players, int pid){
this.out = out;
this.in = in;
this.players = players;
this.playerid = pid;
}
public void run() {
// gebe zuerst immer die playerID aus
try{
out.writeInt(playerid);
} catch (IOException e1){
System.out.println("Failed to send PlayerID");
}
// lese koordinaten des jeweiligen players ein und sende sie an alle anderen clients
// damit diese sie zeichnen können
while(true){
try{
playeridin = in.readInt();
xin = in.readInt();
yin = in.readInt();
for(int i = 0; i < 5; i++){
if(players[i] != null){
players[i].out.writeInt(playeridin);
players[i].out.writeInt(xin);
players[i].out.writeInt(yin);
}
}
} catch (IOException e){
players[playerid] = null;
}
}
}
}
und hier die Client-Klasse:
Java:
import java.net.*;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Client extends MyFrame implements Runnable, KeyListener{
static Socket socket;
static DataInputStream in;
static DataOutputStream out;
int playerid;
int x[] = new int[5];
int y[] = new int[5];
boolean up,down,right,left;
int playerx, playery;
MyFrame f;
public void init(){
// erstelle frame
f = new MyFrame();
f.setSize(600, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setResizable(false);
f.setVisible(true);
// füge keylistener hinzu, um tastatureingaben zu erkennen
addKeyListener(this);
// initialisierung des clients
try{
System.out.println("Verbinde...");
socket = new Socket("localhost",8888);
System.out.println("Verbunden.");
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 updateCoordinates(int pid, int x2, int y2){
this.x[pid] = x2;
this.y[pid] = y2;
}
public void run() {
while(true){
if(right) playerx += 10;
if(up) playery -= 10;
if(down) playery += 10;
if(left) playerx -= 10;
if(up||down||left||right){
try {
out.writeInt(playerid);
out.writeInt(playerx);
out.writeInt(playery);
} catch (IOException e) {
System.out.println("Error sending Coordinates.");
}
}
f.repaintScreen();
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP) up = true;
if(e.getKeyCode() == KeyEvent.VK_RIGHT) right = true;
if(e.getKeyCode() == KeyEvent.VK_DOWN) down = true;
if(e.getKeyCode() == KeyEvent.VK_LEFT) left = true;
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP) up = false;
if(e.getKeyCode() == KeyEvent.VK_RIGHT) right = false;
if(e.getKeyCode() == KeyEvent.VK_DOWN) down = false;
if(e.getKeyCode() == KeyEvent.VK_LEFT) left = false;
}
@Override
public void keyTyped(KeyEvent arg0) {}
}
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.updateCoordinates(playerid, x, y);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Für eure Hilfe wäre ich sehr dankbar
lieben Gruß!