JAVA - трудности с простым сервером, видящим клиентов - PullRequest
1 голос
/ 13 апреля 2009

Я пытаюсь сделать простую игру, которая идет по сети TCP.

Сервер делает что-то подобное для проверки соединений, в Server.java:

try
{
    server = new ServerSocket(port);
    System.out.println("Server started on port " + port);

    while (true)
    {
        socket = server.accept();
        System.out.println("A new player has joined the server.");
        new Server(socket).start();
    }
}

А чтобы сделать нового клиента, в Player.java:

socket = new Socket(hostname, port);

Теперь все работает нормально, но мне нужен сервер, чтобы добавить экземпляр Player в список массивов и иметь возможность отправлять всем им определенные данные. У них обоих есть основные методы, поэтому один компьютер может просто запустить сервер и подключить к нему 4 других компьютера, запустив Player.java. Если все, что игрок делает, это создает новый сокет, то как сервер должен взаимодействовать с каждым игроком?

Ответы [ 4 ]

1 голос
/ 13 апреля 2009

server.accept() метод возвращает вам объект Socket. Socket класс имеет метод getOutputStream(), вы можете использовать этот поток для отправки сообщения.

1 голос
/ 13 апреля 2009

Я не уверен, что понимаю вопрос.

При вызове accept будет получено различное возвращаемое значение для каждого подключающегося клиента (обычно представляющее адрес клиента и порт), поэтому вам необходимо сохранить каждый из них. Затем вы можете взаимодействовать через сокеты, у Sun есть довольно хороший пример в своем уроке :

Как говорится, избавьте себя от головной боли и подумайте о производительности, которую вы ожидаете от игры. Вы можете сэкономить много хлопот и легко добавить надежность и масштабируемость, если вы используете JMS и ActiveMQ для своих коммуникаций, а не возитесь с сокетами самостоятельно.

Потратьте свое время на написание игры, не занимаясь низкоуровневым программированием сокетов, если только вы не пытаетесь учиться.

0 голосов
/ 14 апреля 2009

Позвольте мне сделать некоторые рефакторинги имени, основанные на моем понимании его вопроса.

Переименование существующего Server.java в Player.java

Player player = new Player(socket);
players.add(player); // server can use this collection for group notification
.....


class Player implements Runnable {

   Player(Socket socket) {
        this.socket = socket;
        new Thread(this).start(); // later you may avoid it by using a threadpool executor. 
   }


   public void run() {
        while(running) {
            // read and write data from client machines.
            // use wait() appropriately
        }
   }

}

Если сервер хочет уведомить всех игроков, он может вызвать метод на объекте игрока, который в дальнейшем выполняет необходимую работу для отправки данных клиенту.

Наконец переименуйте существующий Player.java в GameLauncher.java.

Вы можете получить больше контроля после выполнения этого простого рефакторинга 'переименования'.

0 голосов
/ 13 апреля 2009

Попробуйте это:

Server client = new Server(socket);
clients.add(client);
client.start();

, где clients имеет тип List<Server>. Затем добавьте метод sendMessage (или любой другой) в ваш класс Server. Тогда:

for (Server client : clients) {
    client.sendMessage("...");
}

Надеюсь, это поможет! (Кстати, есть определенная причина, по которой я называю переменные client и clients. Они действительно являются абстракциями для входящих клиентов, а не серверов как таковых, хотя код внутри Server на самом деле является сервером для взаимодействия с указанными клиентами .)

...