2013-04-05 4 views
3

Извините за мой английский.autobahn не работает с tomcat 7 websocket

Я хочу запрограммировать родное приложение в Android для подключения к серверу для интерактивных коммуникаций. Тегнология Websocket - идеальный фотис. Я установил и работаю Tomcat 7.0.39 на своем ноутбуке с IP 192.168.1.250. Я попробовал примеры echo, snake и т. Д., И он отлично работает с использованием ws: // localhost: 8080/.... и с использованием ws: //192.168.1.250: 8080/...

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

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

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

Что не так? Брандмауэр выключен, и wirehark показывает мне, как клиент 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-сервлеты с аналогичной тенологией) через websockets? Спасибо

+0

Не могли бы вы вывести вывод журнала AutobahnAndroid и/или Tomcat? – oberstet

+0

У меня такая же проблема при использовании Tomcat (отлично работает с причалом, хотя ..) – Alexis

ответ

0

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

Смежные вопросы