автобан не работает с веб-сокетом tomcat 7

Извините за мой английский.

Я хочу запрограммировать собственное приложение в Android для подключения к серверу для интерактивного общения. Для этого идеально подходит технология веб-сокетов. У меня установлен и работает Tomcat 7.0.39 на моем ноутбуке с IP-адресом 192.168.1.250. Я пробовал примеры эха, змеи и т. д., и он отлично работает, используя ws://localhost:8080/.... и используя ws://192.168.1.250:8080/...

Я использую автобан с eclipse для подключения к моему серверу. Я установил apk на свой мобильный телефон Android с образцом веб-сокета клиента автобана, и он отлично соединяется с ws://echo.websocket.org.

Проблема в том, что с андроида на мой сервер (в моем ноуте) не работает. От Android до ws://echo.websocket.org работает нормально (я полагаю, что пример автобана работает хорошо), мой сервер работает нормально, потому что примеры идут с прекрасной работой tomcat.

Поскольку мне приходится интенсивно работать с информацией, которая перемещается между сервером и клиентами, я не могу использовать javascript на стороне сервера, мне нужны Java-сервлеты или другие инструменты для работы с базами данных, файлами и т.д.

Что случилось? Брандмауэр выключен, и wireshark показывает мне, как клиент Android пытается подключиться к серверу моего ноутбука (я плохо понимаю информацию wireshark), но соединение теряется.

Это мой код Android:

    package com.example.autobahnandroiddemo;

    import de.tavendo.autobahn.WebSocketConnection;
    import de.tavendo.autobahn.WebSocketException;
    import de.tavendo.autobahn.WebSocketHandler;
    import android.app.Activity;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;


    public class MainActivity extends Activity {

       static final String TAG = "de.tavendo.autobahn.echo";
       private static final String PREFS_NAME = "AutobahnAndroidEcho";

       static EditText mHostname;
       static EditText mPort;
       static TextView mStatusline;
       static Button mStart;

       static EditText mMessage;
       static Button mSendMessage;

       private SharedPreferences mSettings;

       private void alert(String message) {
          Toast toast = Toast.makeText(getApplicationContext(), message,         Toast.LENGTH_SHORT);
          toast.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL, 0, 0);
          toast.show();
       }

       private void loadPrefs() {

          mHostname.setText(mSettings.getString("hostname", ""));
          mPort.setText(mSettings.getString("port", "9000"));
       }

       private void savePrefs() {

          SharedPreferences.Editor editor = mSettings.edit();
          editor.putString("hostname", mHostname.getText().toString());
          editor.putString("port", mPort.getText().toString());
          editor.commit();
       }

       private void setButtonConnect() {
          mHostname.setEnabled(true);
          mPort.setEnabled(true);
          mStart.setText("Connect");
          mStart.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View v) {
                start();
             }
          });
       }

       private void setButtonDisconnect() {
          mHostname.setEnabled(false);
          mPort.setEnabled(false);
          mStart.setText("Disconnect");
          mStart.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View v) {
                mConnection.disconnect();
             }
          });
       }

       private final WebSocketConnection  mConnection = new WebSocketConnection();

       private void start() {

          final String wsuri = mHostname.getText() + ":" + mPort.getText();

          mStatusline.setText("Status: Connecting to " + wsuri + " ..");

          setButtonDisconnect();

          try {
             mConnection.connect(wsuri, new WebSocketHandler() {
                @Override
                public void onOpen() {
                   mStatusline.setText("Status: Connected to " + wsuri);
                   savePrefs();
                   mSendMessage.setEnabled(true);
                   mMessage.setEnabled(true);
                }

                @Override
                public void onTextMessage(String payload) {
                   alert("Got echo: " + payload);
                }

                @Override
                public void onClose(int code, String reason) {
                   alert("Connection lost.");
                   mStatusline.setText("Status: Ready.");
                   setButtonConnect();
                   mSendMessage.setEnabled(false);
                   mMessage.setEnabled(false);
                }
             });
          } catch (WebSocketException e) {

             Log.d(TAG, e.toString());
          }
       }

       @Override
       public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          mHostname = (EditText) findViewById(R.id.hostname);
          mPort = (EditText) findViewById(R.id.port);
          mStatusline = (TextView) findViewById(R.id.statusline);
          mStart = (Button) findViewById(R.id.start);
          mMessage = (EditText) findViewById(R.id.msg);
          mSendMessage = (Button) findViewById(R.id.sendMsg);

          mSettings = getSharedPreferences(PREFS_NAME, 0);
          loadPrefs();

          setButtonConnect();
          mSendMessage.setEnabled(false);
          mMessage.setEnabled(false);

          mSendMessage.setOnClickListener(new Button.OnClickListener() {
             public void onClick(View v) {
                mConnection.sendTextMessage(mMessage.getText().toString());
             }
          });
       }

       @Override
       protected void onDestroy() {
           super.onDestroy();
           if (mConnection.isConnected()) {
              mConnection.disconnect();
           }
       }

       @Override
       public boolean onCreateOptionsMenu(Menu menu) {
           MenuInflater inflater = getMenuInflater();
           inflater.inflate(R.menu.main_menu, menu);
           return true;
       }

       @Override
       public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
             case R.id.quit:
                finish();
                break;
             default:
                return super.onOptionsItemSelected(item);
          }
          return true;
       }

    }

И ЭТО МОЙ КОД СЕРЛЕТА TOMCAT:

    package servlets;

    import org.apache.catalina.websocket.MessageInbound;
    import org.apache.catalina.websocket.StreamInbound;
    import org.apache.catalina.websocket.WebSocketServlet;
    import org.apache.catalina.websocket.WsOutbound;

    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.nio.CharBuffer;

    public class SimpleWebSocketServlet extends WebSocketServlet {
    private static final long serialVersionUID = 1L;

        @Override
        protected StreamInbound createWebSocketInbound(String string, HttpServletRequest hsr) {
            return new MessageInbound() {

                @Override
                protected void onBinaryMessage(ByteBuffer bb) throws IOException {

                }

                @Override
                protected void onTextMessage(CharBuffer cb) throws IOException {
                    System.out.println(cb.toString());
                    WsOutbound outbound = getWsOutbound();
                    outbound.writeTextMessage(cb);
                }
            };
        }

    }

Я не знаю, что случилось. Есть ли другое решение для использования клиента Android в сочетании с сервером (сервлеты Java на аналогичной технологии) через веб-сокеты? Спасибо


person user2248409    schedule 05.04.2013    source источник
comment
Не могли бы вы опубликовать вывод журнала AutobahnAndroid и/или Tomcat?   -  person oberstet    schedule 22.04.2013
comment
У меня точно такая же проблема при использовании Tomcat (хотя с причалом работает нормально ..)   -  person Alexis    schedule 28.05.2013


Ответы (1)


Я думаю, вы должны были поместить код подключения в onCreate.

person Ngo Anh Tuan-HEDSPI    schedule 20.05.2013