问题 Java websocket主机?


我正在尝试一些多人游戏的想法,我正在尝试创建一个Java应用程序来提供基于Web浏览器的多人游戏。

我的开发环境是主机上的Eclipse,以及笔记本电脑上的记事本+谷歌浏览器。

我在客户端使用javascript创建websocket,并在服务器端使用java.net.Socket。

我已经设法在两端确认连接,但似乎无法在客户端关闭连接的情况下发送或接收它们之间的任何数据(甚至没有错误;只是看起来吓坏了某事并调用套接字。关)。

有没有人有任何想法?

这是一些代码:

客户:

<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!");
}

7959
2017-11-27 16:30


起源

您是否有任何理由不使用现有的Websockets服务器? - Peter Knego
有关现成的websockets服务器列表,请参阅此问题: stackoverflow.com/questions/4278456/... - Neeme Praks


答案:


而不是采取痛苦的方式来实施 规范 在Java中,我建议您使用现有的解决方案 jWebSocket

如果你不介意离开Java土地,我也建议你看一看 Node.js的 为您的服务器。

在JavaScript中同时执行服务器和客户端将为您节省大量时间和大量代码,尤其是因为JSON不能很好地适应静态域。在Node.js中创建多人游戏服务器也是微不足道的,因为基于事件的单线程模型非常适合整个事情。

有关WebSocket的更多信息,请参阅 常问问题。如果您想开始使用Node.js,请查看 TagWiki

无耻的插头如下

对于使用Node.js编写的两个多人游戏,请查看我的 GitHub页面


11
2017-11-27 16:41





我建议我们的高级解决方案: 钢背服务器。它包含服务器和客户端,您可以从几个现有的低级WebSocket引擎(如Jetty,Netty或Tomcat)中进行选择,使用Bristleback进行开发是极其快速和简单的。但是,它仍然是Beta,我们正在努力发布最终的1.0.0版本。如果您使用Maven,我们提供了一个准备使用Web应用程序的原型。

我是Bristleback Server的共同创建者之一。


2
2017-10-02 07:40





试试这个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>

2
2018-05-07 14:11





因为没有人真正回答你的问题:它不起作用的原因是因为你没有实现websocket规范。设置正确的websocket连接比打开套接字要花费更多的工作,因为websocket连接设置以HTTP升级请求开始。您的客户端正在关闭连接,因为它在升级请求中没有得到肯定的答案。


1
2017-09-05 20:29



七年前,伊沃·韦特泽尔回答了这个问题。 - Toby Wilson


我无法帮助您使用套接字,但我可以建议您使用RMI技术吗?我正在尝试在java中制作多人RPG,并且我在服务器和客户端之间使用远程方法调用(也可以从服务器回调客户端)。它很容易使用它,但它使用TCP而不是UDP。在局域网体验中没有任何延迟,在互联网上我还没有尝试过。但是,如果您的游戏在请求和响应之间容忍一点延迟,则没有问题。 这是我的项目的链接,Client和Server类可能对您有用。


-2
2017-11-27 16:49