2010-11-27 65 views
11

我正在嘗試一些多人遊戲的想法,並試圖創建一個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://stackoverflow.com/questions/4278456/websockets-production-ready-server – 2010-11-27 19:46:46

回答

10

而不是去用Java實現的spec的痛苦的樣子,我建議你使用現有的解決方案如jWebSocket

另外如果你不介意離開Java的土地,我也建議你看看你的服務器的Node.js

在JavaScript中同時執行服務器和客戶端將爲您節省大量時間和大量代碼,特別是因爲JSON不適合靜態的土地。在Node.js中創建多人遊戲服務器也很簡單,因爲基於事件的單線程模型非常適合整個遊戲。

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

無恥插頭如下

對於使用Node.js的看看我的GitHub page寫了兩個多人遊戲。

-2

我不能幫你插座,但我可以建議你使用RMI技術嗎?我試圖在java中製作一個多人RPG,並且在服務器和客戶端之間使用遠程方法調用(也可以從服務器回撥客戶端)。它很容易使用它,但它使用TCP而不是UDP。在局域網體驗中,沒有任何延遲,在互聯網上我還沒有嘗試過。但是,如果您的遊戲容忍請求和響應之間的延遲,則沒有問題。 這是我的項目的鏈接,客戶端和服務器類可能對您有用。

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> 
2

我建議我們的高層次的解決方案:Bristleback Server。它包含服務器和客戶端,您可以從幾個現有的低級WebSocket引擎(如Jetty,Netty或Tomcat)中進行選擇,使用Bristleback進行開發非常快速且簡單。但是,它仍然是Beta版本,我們正在努力發佈最終的1.0.0版本。如果你使用Maven,我們提供了一個準備好使用web應用程序的原型。

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

1

由於還沒有人真正回答你的問題:它不起作用的原因是因爲你沒有實現websocket規範。由於websocket連接設置以HTTP升級請求開始,因此設置適當的websocket連接比打開套接字需要更多的工作。您的客戶正在關閉連接,因爲它沒有收到有關升級請求的肯定答案。