2010-11-27 9 views
11

Ich versuche gerade einige Multiplayer-Spielideen auszuprobieren und versuche eine Java-Anwendung zu erstellen, um ein Webbrowser-basiertes Multiplayer-Spiel zu bedienen.Java-Websocket-Host?

Meine Entwicklungsumgebung ist Eclipse auf dem Hauptcomputer und Notizblock + Google Chrome auf diesem Laptop.

Ich erstelle den Websocket mit Javascript auf der Client-Seite und mit der java.net.Socket am Server-Ende.

Ich habe es geschafft, eine Verbindung an beiden Enden bestätigt, aber kann nicht scheinen, um Daten zwischen ihnen zu senden oder zu empfangen, ohne den Client die Verbindung zu schließen (nicht einmal Fehler; nur scheint etwas ausflippen und rufe socket.close) auf.

Hat jemand irgendwelche Ideen?

Hier einige Code:

Auftraggeber:

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

Server:

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

Gibt es einen Grund, warum Sie keinen vorhandenen WebSockets-Server verwenden? –

+0

Siehe diese Frage für eine Liste von vorgefertigten WebSockets-Servern: http://StackOverflow.com/Questions/4278456/WebSockets-Production-Ready-Server –

Antwort

10

Anstatt die schmerzhafte Art und Weise die spec in Java der Umsetzung geht, würde ich vorschlagen, dass Sie verwenden eine bestehende Lösung wie jWebSocket.

Auch wenn es Ihnen nichts ausmacht, Java-Land zu verlassen, würde ich auch vorschlagen, dass Sie einen Blick auf Node.js für Ihren Server werfen.

Wenn Sie sowohl Server als auch Client in JavaScript verwenden, sparen Sie viel Zeit und viel Code, zumal JSON einfach nicht so gut in statisches Land passt. Auch das Erstellen von Multiplayer-Servern in Node.js ist trivial, da das Event-basierte Single-Threaded-Modell ziemlich gut in das Ganze passt.

Weitere Informationen zu WebSocket finden Sie in der FAQ. Falls Sie mit Node.js beginnen möchten, werfen Sie einen Blick auf die TagWiki.

schamlose Werbung folgt

Für zwei Multiplayer-Spiele, die geschrieben wurden mit Node.js an meinem GitHub page einen Blick darauf werfen.

-2

Ich kann Ihnen nicht mit Sockets helfen, aber kann ich Ihnen vorschlagen, RMI-Technologie zu verwenden? Ich versuche, ein Multiplayer-RPG in Java zu machen, und ich benutze Remote-Methode Aufruf zwischen Server und Client (es ist möglich, auch den Client vom Server zurückzurufen). Es ist wirklich einfach zu benutzen, aber es verwendet TCP statt UDP. In LAN-Erfahrung gibt es keine Verzögerung, im Internet habe ich noch nicht ausprobiert. Allerdings, wenn Ihr Spiel nur ein bisschen Verzögerung zwischen Anfrage und Antwort toleriert, gibt es kein Problem. Dies ist der Link meines Projekts, Client und Server Klassen können für Sie nützlich sein.

2

dieses lib Versuchen - https://github.com/mrniko/netty-socketio

lib Netty auf Hochleistungs-Sockets. Es unterstützt das neueste Protokoll des Socket.IO-Servers. Mehrere Transporte einschließlich Websocket.

auf Web-Seite verwenden Socket.IO Client 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

würde ich unsere hohe Lösung vorschlagen: Bristleback Server. Es enthält sowohl Server als auch Client, Sie können aus mehreren vorhandenen Low-Level-WebSocket-Engines (wie Jetty, Netty oder Tomcat) wählen, die Entwicklung mit Bristleback ist extrem schnell und einfach. Es ist jedoch immer noch Beta und wir arbeiten hart daran, eine finale Version 1.0.0 zu veröffentlichen. Wenn Sie Maven verwenden, haben wir einen Archetyp mit gebrauchsfertiger Webanwendung bereitgestellt.

Ich bin einer der Mitgestalter von Bristleback Server.

1

Da hat noch niemand Ihre Frage wirklich beantwortet: Der Grund, warum es nicht funktioniert, ist, weil Sie die WebSocket-Spezifikation nicht implementieren. Es erfordert viel mehr Arbeit, eine richtige Websocket-Verbindung einzurichten, als nur einen Socket zu öffnen, da das Websocket-Verbindungs-Setup mit einer HTTP-Upgrade-Anfrage beginnt. Ihr Client schließt die Verbindung, da er zu Beginn keine positive Antwort auf die Upgradeanforderung erhält.

+0

Ivo Wetzel beantwortet die Frage zu diesem Zweck, vor sieben Jahren. –