android - 高速公路不适用于 tomcat 7 websocket

标签 android websocket tomcat7 autobahn

对不起我的英语。

我想在 Android 中编写 native 应用程序以连接服务器以进行交互式通信。 Websocket 技术非常适合这个。我已经在我的笔记本电脑上安装并运行了 Tomcat 7.0.39,IP 为 192.168.1.250。我已经尝试了 echo、snake 等示例,使用 ws://localhost:8080/.... 和使用 ws://192.168.1.250:8080/... 效果很好

我正在使用带有 eclipse 的高速公路连接到我的服务器。我已经在我的 Android 手机上安装了带有高速公路客户端 websocket 示例的 apk,它与 ws://echo.websocket.org 完美连接。

问题是从 android 到我的服务器(在我的笔记本电脑中)不工作。从 android 到 ws://echo.websocket.org 工作正常(我想高速公路示例工作正常),我的服务器工作正常,因为 tomcat 附带的 de 示例工作正常。

因为我必须对在服务器和客户端之间传输的信息进行集中处理,所以我不能在服务器端使用 javascript,我需要 java servlet 或其他工具来处理数据库、文件等。

怎么了?防火墙已关闭,wireshark 向我展示了 android 客户端如何尝试连接到我的笔记本电脑服务器(我不太了解 wireshark 信息)但连接丢失。

这是我的安卓代码:

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

    }

这是我的 SERVLET 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);
                }
            };
        }

    }

不知道怎么回事。是否有另一种解决方案通过 websockets 将 android 客户端与服务器(类似技术上的 java servlet)结合使用? 谢谢

最佳答案

我想你应该把连接的代码放到onCreate中。

关于android - 高速公路不适用于 tomcat 7 websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15831554/

相关文章:

java - 在使用应用程序期间如何启用 android LED?

android - 在 Tab 主机 android 中打开子 Activity

android - 共享偏好? javax.crypto.BadPaddingException : pad block corrupted only in some devices

java - 移动一个元素而不移动其他元素 [Android ADT]

Python Websocket : infinite lock on client recv

tomcat - Apache Tomcat 1.7 如何将附加参数传递给 JAAS

java - Internet Explorer 不支持 PongWebSocketFrame

javascript websocket onmessage event.data

来自 UncaughtExceptionHandler 的 Tomcat 7 OutOfMemoryError

html - 无法在 JSP 中包含 css 和 js 引用