在android java中连接到服务器websocket

Posted

技术标签:

【中文标题】在android java中连接到服务器websocket【英文标题】:Connecting to server's websocket on android java 【发布时间】:2020-08-24 11:50:52 【问题描述】:

我正在努力连接到 android java 上的服务器 websocket。

我在服务器端的 websocket 主类如下。

@ServerEndpoint("/websocket")
public class WebsocketListener 

    @OnOpen
    public void handleConnect(Session session) 
        System.out.println("Client connect : " + session);
    

    @OnMessage
    public void handleMessage(Session session, String message) 
        System.out.println(session + " : " + message);
        String[] tokens = message.split(":::");

        if(tokens[0].equals("connect")) 
            WebSocketSessionManager.addSession(tokens[1], session);
         else if(tokens[0].equals("alert")) 
            WebSocketSessionManager.sendMessage(tokens[1]);
        
    

    @OnClose
    public void handleDisconnect(Session session) 
        System.out.println(session + "과의 연결 종료.");
        WebSocketSessionManager.removeSession(session);
    

    @OnError
    public void handleError(Session session, Throwable throwable) 
        throwable.printStackTrace();
        WebSocketSessionManager.removeSession(session);
    

下面是我尝试连接到服务器的 websocket 的 android-java 代码。

package com.example.socketexample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.URI;

public class MainActivity extends AppCompatActivity 

    private Button button;
    private WebSocketClient webSocketClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                connectToWebSocket();
            
        );
    

    private void connectToWebSocket() 

        Log.i("websocket", "connectToWebSocket() called.");
        URI uri;
        try 
            uri = new URI("ws://10.21.20.24:8080/websocket");
         catch(Exception e)
            e.printStackTrace();
            return;
        

        webSocketClient = new WebSocketClient(uri) 
            @Override
            public void onOpen(ServerHandshake handshakedata) 
                Log.i("websocket", "connected to server.");
                webSocketClient.send("connect:::TESTKEY");
                webSocketClient.send("alert:::HI");
            

            @Override
            public void onMessage(String message) 
                Log.i("websocket", message);
            

            @Override
            public void onClose(int code, String reason, boolean remote) 
                Log.i("websocket", "closed.");
            

            @Override
            public void onError(Exception ex) 
                Log.i("websocket" , "error : " + ex.getMessage());
            
        ;
        webSocketClient.connect();
    

我看到websocket使用ws://协议,所以我将URI设置为ws://10.21.20.24,这是我wifi中的IP地址。

对于服务器的 websocket,我使用下面的 pom.xml 依赖。

<dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
        <scope>provided</scope>
</dependency>

对于android的websocket,我使用的是下面的gradle依赖。

implementation 'org.java-websocket:Java-WebSocket:1.3.0'

提前非常感谢您。 :(

【问题讨论】:

在 android 的 logcat 上,我什么也得不到。 【参考方案1】:

对于遇到我遇到的同样问题的每个人......

我通过添加new Draft_17() 作为new WebSocketClient() 的第二个参数解决了这个问题。代码总结如下。

private void connectToWebSocket() 

    Log.i("websocket", "connectToWebSocket() called.");
    URI uri;
    try 
        uri = new URI("ws://10.21.20.24:8080/websocket");
     catch(Exception e)
        e.printStackTrace();
        return;
    

    webSocketClient = new WebSocketClient(uri, new Draft_17()) 
        // ...
    

但是,这个问题是从 2017 年开始的,我想我必须找到 Draft_17 的替代品。

https://github.com/TooTallNate/Java-WebSocket/issues/478

祝你好运!

【讨论】:

以上是关于在android java中连接到服务器websocket的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 在 android 中连接到 sql server 2008

在 Java 中连接到 websocket

如何在java中连接到gtalk?

在android应用程序中连接到主机名而不是IP地址

如何在 PySpark 中连接到 Presto JDBC?

Android:使用 ***Service API 在 Android 4.0 中连接到 *** 的示例代码 [关闭]