在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的主要内容,如果未能解决你的问题,请参考以下文章