0

編集: Web インターフェイスを介して Android とブラウザーにクイズ アプリケーションを実装したいと考えています。サーバーとクライアントの間で通信する方法を探しています。socket.io を試してみましたが、Android で動作させることができませんでした。

nodester (nodester.com) でホストされている node.js サーバーを使用しています。いくつかのライブラリを試しましたが、機能しませんでした。

私は現在、https: //github.com/einaros/ws の einaros/ws を使用しています。

サーバーコードは次のとおりです。

var clients = [],
numClients = 0;


var WebSocketServer = require('ws').Server,
  wss = new WebSocketServer({port: 20083});

wss.on('connection', function(ws) {

  ws.on('message', function(message) {
    console.log(wss.clients);
    console.log('received: %s', message);
    incomingMessage(message, ws)
  });

  /*
  ws.on('eigenesEvent', function(message) {
    console.log('eigenes Event ausgelöst: ' + message);
  });
  */
});

function incomingMessage(msg, ws) {
  //console.log(wss.clients);
  var obj = JSON.parse(msg);

    if(obj.type == "connect") {

      for(var i=0;i<clients.length;i++) {
        if(clients[i] == obj.id) {
          ws.send(JSON.stringify({
            to: obj.id,
            message: "name vergeben"
          }));
          return;
        }
      }
      clients[numClients] = obj.id;
      numClients++;
      for(var i=0;i<clients.length;i++) {
        console.log("Client" + i + ": " + clients[i]);
      }
      ws.send(JSON.stringify({
          to: "all",
          message: obj.id + " connected"
      }));
    }

  if(obj.type == "disconnect") {

    for(var i=0;i<clients.length;i++) {
      if(clients[i] == obj.id) {
        clients.splice(i, 1);
        numClients--;
        for(var i=0;i<clients.length;i++) {
          console.log("Client" + i + ": " + clients[i]);
        }
      }
    }

    ws.send(JSON.stringify({
      to: "all",
      message: obj.id + " disconnected"
    }));
    return;
  }

  if(obj.type == "answer") {
    if("id" in obj) {
      if(obj.answer == "a") {
        ws.send(JSON.stringify({
          to: obj.id,
          message: "a is correct"
        }));
      } else {
        ws.send(JSON.stringify({
          to: obj.id,
          message: "answer is incorrect"
        }));
      }
    }
  }

  if(obj.type == "something") {
    if("id" in obj) {
      ws.send(JSON.stringify({
        to: obj.id,
        message: "received: " + obj.message
      }));
    }
  }
}



HTML サイトから、次の方法でサーバーに接続できます。

connect = function() {
    var host = "ws://einaros.nodester.com";

        try{
            socket = new WebSocket(host);
            console.log('WebSocket - status ' + socket.readyState);

            socket.onopen = function(msg) {
                console.log("Welcome - status " + this.readyState);
                socket.send(JSON.stringify({
                    id: model.getClientName(),
                    type: "connect"
                }));
                model.setConnectionStatus(true);
            };

            socket.onmessage = function(msg) {
                console.log("onmessage - msg: " + msg.data);
                checkMessage(msg.data);
            };

            socket.onclose = function(msg) {
                console.log("Disconnected - status " + this.readyState);
                model.setConnectionStatus(false);
            };

        }
        catch(ex){
            console.log(ex);
        }
},



Android クライアント側では、http: //autobahn.ws/android
から AutobahnAndroid を使用しています。Android のクライアント コードは次のとおりです。

package ps.mediengestaltung;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import de.tavendo.autobahn.WebSocketConnection;
import de.tavendo.autobahn.WebSocketException;
import de.tavendo.autobahn.WebSocketHandler;


public class MainActivity extends Activity {



public final WebSocketConnection mConnection = new WebSocketConnection();

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);


    final String wsuri = "ws://einaros.nodester.com";

    try {
        mConnection.connect(wsuri, new WebSocketHandler() {

            @Override
            public void onOpen() {
                Log.d("TAG", "Status: Connected to " + wsuri);
                mConnection.sendTextMessage("Hello Server!");
            }

            @Override
            public void onTextMessage(String payload) {
                Log.d("TAG", "Got echo: " + payload);
            }

            @Override
            public void onClose(int code, String reason) {
                Log.d("TAG", "Connection lost.");
            }
        });
    } catch (WebSocketException e) {
        Log.d("TAG", e.toString());
    }

}

}


LogCat で取得:
08-01 08:48:13.017: D/TAG(704): ステータス: ws://einaros.nodester.com
08-01 08:48:13.167: D/TAG(704) に接続:接続切断。


私は何を間違っていますか?ヒントはありますか?

4

2 に答える 2

2

その理由として考えられるのは、Weberknecht は (古い) Hixie-76 バージョンの WebSocket のみを実装していることです。

WebSocket の最終的な RFC6455 バージョンを実装するAutobahnAndroidを試すことができます。

もう1つのこと:使用しているWebSocketサーバーは(私の知る限り)維持されなくなりました。また、Chrome/Firefox ではサポートされなくなった Hixie-76 のみを実装しています。

次のいずれかを試してください。

免責事項: 私は Autobahn の著者であり、Tavendo で働いています。

于 2012-07-09T15:09:18.833 に答える
1

電話にローカルホストに接続するように求めています。電話でノードを実行していませんか?:)

URI url = new URI("ws://127.0.0.1:8080/test");

代わりに、これは nodester のアドレス/ポートを指している必要があります。

于 2012-07-09T14:32:42.263 に答える