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!");
}
Ответы
Ответ 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. В локальной сети нет задержки, в Интернете я еще не пробовал. Однако, если ваша игра терпит лишь немного заторможенность между запросом и ответом, нет проблем.
Это ссылка моего проекта. Классы клиентов и серверов могут быть полезны для вас.