Подтвердить что ты не робот

Java websocket host?

В настоящий момент я пытаюсь выработать несколько игровых идей и пытаюсь создать приложение Java для работы в многопользовательской игре на основе веб-браузера.

Моя среда разработки - Eclipse на главной машине и блокнот + Google Chrome на этом ноутбуке.

Я создаю websocket, используя javascript на стороне клиента, и используя java.net.Socket на сервере.

Мне удалось получить соединение, подтвержденное с обоих концов, но, похоже, не может отправлять или получать какие-либо данные между ними, если клиент не закрывает соединение (даже не ошибка, просто кажется, что-то увлекается чем-то и вызов socket.close).

Есть ли у кого-нибудь идеи?

Вот код:

Клиент:

<script type="text/javascript">
var socket;

function init() {
    socket = new WebSocket("ws://192.168.0.3:10000");
    socket.onopen = function() { alert('OPEN: ' + socket.readyState); }
    socket.onmessage = function (msg) { alert('DATA: ' + msg.data); }
    socket.onerror = function (msg) { alert('DATA: ' + msg.data); }
    socket.onclose = function () { alert('CLOSED: ' + socket.readyState); }
}

function onClick() {
    socket.send("YAY!");
}
</script>

Сервер:

public static void main(String args[])
{
    System.out.printLn("Websocket server test");

    ServerSocket connectSocket = null;

    try
    {
        Socket clientSocket;
        connectSocket = new ServerSocket(10000);
        System.out.printLn("Waiting for connection...");
        clientSocket = connectSocket.accept();
        System.out.printLn("Got one!");

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
            new InputStreamReader(clientSocket.getInputStream()));

        for(int i=0;i<100;i++) //Shit but easy
        {
            String data = in.readLine();
            System.out.printLn("Got data: " + data);
            out.printLn("YAY!");
        }
    }
    catch (IOException e)
    {
        System.out.printLn("You fail: " + e.getMessage());
    }

    System.out.printLn("Finished!");
}
4b9b3361

Ответ 1

Вместо того, чтобы идти болезненным способом реализации spec в Java, я бы предположил, что вы используете существующее решение вроде jWebSocket.

Также, если вы не возражаете покинуть Землю Java, я также предлагаю вам взглянуть на Node.js для вашего сервера.

Выполнение как сервера, так и клиента в JavaScript позволит вам сэкономить много времени и много кода, тем более, что JSON просто не вписывается в старую землю. Также создание многопользовательских серверов в Node.js тривиально, так как однопоточная модель на основе событий хорошо подходит для всего.

Дополнительную информацию о WebSocket можно найти в часто задаваемых вопросах. Если вы хотите начать работу с Node.js, посмотрите TagWiki.

бесстыдный штекер следует

Для двух многопользовательских игр, которые были написаны с использованием Node.js, посмотрите мою страницу GitHub.

Ответ 2

Попробуйте этот lib - https://github.com/mrniko/netty-socketio

На основе высокопроизводительного сокета lib Netty. Он поддерживает последний протокол сервера Socket.IO. Несколько транспортов, включая websocket.

На веб-странице используйте Socket.IO клиент javascript lib:

<script type="text/javascript">
    var socket = io.connect('http://localhost:81', {
      'transports' : [ 'websocket' ],
      'reconnection delay' : 2000,
      'force new connection' : true
    });
    socket.on('message', function(data) {
         // here is your handler on messages from server
    });

    // send object to server
    var obj = ...
    socket.json.send(obj);
</script>

Ответ 3

Я бы предложил наше решение высокого уровня: Bristleback Server. Он содержит как сервер, так и клиент, вы можете выбирать из нескольких существующих низкоуровневых WebSocket-движков (таких как Jetty, Netty или Tomcat), разработка с помощью Bristleback чрезвычайно быстрая и простая. Тем не менее, он по-прежнему является бета-версией, и мы прилагаем все усилия, чтобы выпустить окончательную версию 1.0.0. Если вы используете Maven, мы предоставили архетип с готовым к использованию веб-приложением.

Я один из соавторов Bristleback Server.

Ответ 4

Поскольку никто еще не ответил на ваш вопрос: причина, по которой это не работает, заключается в том, что вы не используете спецификацию websocket. Требуется гораздо больше работы по настройке правильного соединения с веб-сайтами, чем просто открытие сокета, поскольку настройка соединения с веб-сервером начинается с запроса HTTP-обновления. Ваш клиент закрывает соединение, потому что он не получает положительного ответа на запрос обновления, чтобы начать с.

Ответ 5

Я не могу помочь вам с сокетами, но могу ли я предложить вам использовать технологию RMI? Я пытаюсь сделать многопользовательский rpg в java, и я использую удаленный вызов метода между сервером и клиентом (возможно также обратный вызов клиента с сервера). Это очень простое использование, но вместо UDP используется TCP. В локальной сети нет задержки, в Интернете я еще не пробовал. Однако, если ваша игра терпит лишь немного заторможенность между запросом и ответом, нет проблем. Это ссылка моего проекта. Классы клиентов и серверов могут быть полезны для вас.