Java websocket主机?

Java websocket主机?

问题描述:

我正在尝试一些多人游戏的想法,并试图创建一个Java应用程序来为基于Web浏览器的多人游戏提供服务。Java websocket主机?

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

我在客户端使用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服务器? – 2010-11-27 16:38:20

+0

请参阅此问题以获得现成的Web服务器列表:http://*.com/questions/4278456/websockets-production-ready-server – 2010-11-27 19:46:46

而不是去用Java实现的spec的痛苦的样子,我建议你使用现有的解决方案如jWebSocket

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

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

有关WebSocket的更多信息可在FAQ中找到。如果您想开始使用Node.js,请查看TagWiki

无耻插头如下

对于使用Node.js的看看我的GitHub page写了两个多人游戏。

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

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

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

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

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