Java WebSocket 主机?

12

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

我的开发环境是主机上的Eclipse,以及笔记本电脑上的notepad和Google Chrome。

我正在使用javascript在客户端创建websocket,并在服务器端使用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
你不使用现有的Websockets服务器有什么原因吗? - Peter Knego
请参考以下问题,了解现成的WebSockets服务器列表:https://dev59.com/aW855IYBdhLWcg3wilCD - Neeme Praks
5个回答

11

不要走Java实现spec的痛苦之路,我建议您使用像jWebSocket这样的现有解决方案。

如果您不介意离开Java领域,我还建议您查看Node.js作为服务器。

在JavaScript中同时进行服务器和客户端将节省大量时间和代码,特别是因为JSON在静态环境下并不适用。此外,在Node.js中创建多人游戏服务器很容易,因为基于事件的单线程模型非常适合整个过程。

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

无耻的自我推销如下

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


3
尝试使用这个库 - https://github.com/mrniko/netty-socketio 该库基于高性能的套接字库Netty。它支持最新的Socket.IO服务器协议。包括websocket在内的多种传输方式。
在Web端使用Socket.IO客户端javascript库:Socket.IO
<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
我建议使用我们的高级解决方案:刺背服务器。它包含服务器和客户端,您可以从几个现有的低级WebSocket引擎中选择(如Jetty、Netty或Tomcat),使用刺背进行开发非常快速和简单。然而,它仍处于Beta版本,我们正在努力发布最终的1.0.0版本。如果您使用Maven,我们提供了一个原型,可用于Web应用程序。

我是刺背服务器的联合创始人之一。


1

由于没有人真正回答你的问题,所以它不能工作的原因是因为你没有实现websocket规范。建立一个正确的websocket连接比只打开一个socket需要更多的工作,因为websocket连接设置始于HTTP升级请求。你的客户端关闭了连接,因为它没有收到关于开始升级请求的肯定回复。


Ivo Wetzel在七年前回答了这个问题。 - Toby Wilson

-2

我无法帮你解决套接字问题,但我可以建议你使用RMI技术。我正在尝试用Java制作多人在线角色扮演游戏,并在服务器和客户端之间使用远程方法调用(还可以从服务器回调客户端)。它非常容易使用,但它使用TCP而不是UDP。在局域网体验中没有延迟,在互联网上我还没有尝试过。然而,如果你的游戏可以容忍请求和响应之间稍微有点延迟,那就没有问题。 这是我的项目链接,客户端和服务器类可能对你有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接