【问题标题】:Anyone successful in implementing a WebSocket Server for Android?有人成功地为 Android 实现了 WebSocket 服务器吗?
【发布时间】:2013-05-14 09:15:36
【问题描述】:

我正在尝试在同一台 Android 设备上同时实现 WebSocket 客户端和 WebSocket 服务器。基本上我有两个需要通信的 Android 应用程序。我已经成功地使用 LocalSockets 实现了几个测试应用程序,但是目标客户端应用程序是 Web 浏览器应用程序,因此它只能使用 WebSockets。

我已经尝试了 https://github.com/TooTallNate/Java-WebSocket 实现。我的客户端应用程序在前台运行,服务器应用程序在后台的 Android 服务中运行。本质上,我采用了有效的 LocalSocket 实现,并将 LocalSockets 替换为 TooTallNate 的 WebSockets。 WebSocket 服务器似乎无法启动。明显的症状是客户端每次尝试发送内容时都会抛出 NotYetConnectedException。

另一个症状是,如果我尝试使用 WebSocketServer.run() 而不是 WebSocketServer.start(),我会从 ServerSocketChannel.open() 得到一个 IOException。

此时当然欢迎任何想法。谢谢!

【问题讨论】:

    标签: android websocket


    【解决方案1】:

    一个基本的实现是这样的:

    public class ChatServer extends WebSocketServer
    {
        private final String TAG = LogHelper.makeLogTag(ChatServer.class);
    
        private Map<String, WebSocket> clients = new ConcurrentHashMap<>();
    
        public ChatServer(int port)
        {
            super(new InetSocketAddress(port));
        }
    
        public ChatServer(InetSocketAddress address)
        {
            super(address);
        }
    
        @Override
        public void onOpen(WebSocket conn, ClientHandshake handshake) {
            String uniqueID = UUID.randomUUID().toString();
            clients.put(uniqueID, conn);
    
            conn.send(WrapHelper.regToJson(uniqueID));
            conn.send(WrapHelper.resToJson("Welcome to the server!"));
    
    
            broadcast((WrapHelper.resToJson("new connection: " + handshake.getResourceDescriptor()))); //This method sends a message to all clients connected
            LogHelper.e(TAG, conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!");
        }
    
        @Override
        public void onClose(WebSocket conn, int code, String reason, boolean remote) {
            broadcast(WrapHelper.resToJson(conn + " has left the room!"));
            LogHelper.e(TAG, conn + " has left the room!");
        }
    
        @Override
        public void onMessage(WebSocket conn, String message) {
            Gson gson = new Gson();
            final Frame frame = gson.fromJson(message, Frame.class);
            if (frame != null) {
                LogHelper.e(TAG, "frame: " + frame);
    
                switch (frame.getCmd()) {
                    case CMD_MSG:
                        broadcast(message);
    
                        break;
    
                    case CMD_REG_USER:
    
                        break;
                }
            }
            LogHelper.e(TAG, conn + ": " + message);
        }
    
        @Override
        public void onMessage(WebSocket conn, ByteBuffer message) {
            broadcast(message.array());
            LogHelper.e(TAG, conn + ": " + message);
        }
    
        @Override
        public void onError(WebSocket conn, Exception ex)
        {
            ex.printStackTrace();
            if (conn != null) {
                // some errors like port binding failed may not be assignable to a specific websocket
            }
        }
    
        @Override
        public void onStart()
        {
            LogHelper.e(TAG, "Server started!");
            setConnectionLostTimeout(0);
            setConnectionLostTimeout(100);
        }
    }
    

    在此示例中,您可以看到我们正在覆盖 WebSocketServer 类的抽象方法。您可以创建一个界面来更新您的 UI。

    然后在您的主要活动中,您可以像这样使用它:

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        ...
    
        ChatServer server = new ChatServer(DEFAULT_CHAT_PORT);
        server.start();
    
        ...
    }
    

    我有一个 chat sample here. 的完整实现

    【讨论】:

      【解决方案2】:

      试用适用于 Android 的 WebSocket 和 Socket.io? https://github.com/koush/android-websockets

      【讨论】:

      • 我会仔细看看这个,但乍一看它似乎只是一个客户端实现。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多