• Android笔记--WebSocket


           这一节了解一下WebSocket的用法,WebSocket是一种基于TCP的全双工通信协议,通过它可以在客户端和服务器之间建立一个持久的连接,实现实时的双向数据传输。它的主要功能特点是允许服务器主动向客户端推送信息,同时也允许客户端主动向服务器发送信息。用法如下:

    app下的gradle:

    implementation "org.java-websocket:Java-WebSocket:1.5.3"

    服务端:

    1. import android.util.Log;
    2. import org.java_websocket.WebSocket;
    3. import org.java_websocket.handshake.ClientHandshake;
    4. import org.java_websocket.server.WebSocketServer;
    5. import java.net.InetSocketAddress;
    6. import java.nio.channels.SelectionKey;
    7. import java.util.HashMap;
    8. import java.util.Map;
    9. import java.util.Set;
    10. public class DCWebSocketServer extends WebSocketServer {
    11. public static String TAG = "DCWebSocketServer";
    12. private Map userMap = new HashMap();
    13. public DCWebSocketServer(int port) {
    14. super(new InetSocketAddress(port));
    15. }
    16. public void sendMessageToUser(String message) {
    17. message = message;
    18. if (userMap == null || userMap.isEmpty()) return;
    19. Set ketSet = userMap.keySet();
    20. for (String key : ketSet) {
    21. WebSocket clientSocket = userMap.get(key);
    22. if (clientSocket != null) {
    23. clientSocket.send(message);
    24. }
    25. }
    26. }
    27. @Override
    28. public void onOpen(WebSocket conn, ClientHandshake handshake) {
    29. String userHost = conn.getRemoteSocketAddress().getHostString();
    30. if(!userMap.containsKey(userHost)) {
    31. userMap.put(userHost,conn);
    32. }
    33. String res = getClientInfo(conn);
    34. }
    35. @Override
    36. protected boolean onConnect(SelectionKey key) {
    37. return super.onConnect(key);
    38. }
    39. @Override
    40. public void onClose(WebSocket conn, int code, String reason, boolean remote) {
    41. String userHost = conn.getRemoteSocketAddress().getHostString();
    42. if (userMap.containsKey(userHost)) {
    43. userMap.remove(userHost);
    44. }
    45. }
    46. @Override
    47. public void onMessage(WebSocket conn, String message) {
    48. if(message != null && message.contains("ScanCode")) {
    49. // sendMessageToUser(message);
    50. }
    51. }
    52. @Override
    53. public void onError(WebSocket conn, Exception ex) {
    54. }
    55. @Override
    56. public void onStart() {
    57. }
    58. private String getClientInfo(WebSocket conn) {
    59. return conn.getRemoteSocketAddress().getHostString()
    60. +":"+ conn.getRemoteSocketAddress().getPort();
    61. }
    62. }
    1. import android.util.Log;
    2. import org.java_websocket.WebSocket;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. public class ServerSocketManager {
    6. public static String TAG = "ServerSocketManager";
    7. private final int SOCKET_PORT = 8888;
    8. private DCWebSocketServer dcWebSocketServer;
    9. private Map userMap = new HashMap();
    10. public ServerSocketManager() {
    11. this.dcWebSocketServer = new DCWebSocketServer(SOCKET_PORT);
    12. }
    13. private static class ServerSocketManagerHolder {
    14. private static final ServerSocketManager INSTANCE = new ServerSocketManager();
    15. }
    16. public static ServerSocketManager getInstance() {
    17. return ServerSocketManagerHolder.INSTANCE;
    18. }
    19. public void sendMessageToAll(String message) {
    20. dcWebSocketServer.sendMessageToUser(message);
    21. }
    22. public boolean start() {
    23. try {
    24. dcWebSocketServer.start();
    25. dcWebSocketServer.setReuseAddr(true);
    26. return true;
    27. } catch (Exception e) {
    28. e.printStackTrace();
    29. return false;
    30. }
    31. }
    32. public boolean stop() {
    33. try {
    34. dcWebSocketServer.stop();
    35. return true;
    36. } catch (Exception e) {
    37. e.printStackTrace();
    38. }
    39. return false;
    40. }
    41. }

    客户端:

    1. import android.util.Log;
    2. import org.java_websocket.client.WebSocketClient;
    3. import org.java_websocket.handshake.ServerHandshake;
    4. import java.net.URI;
    5. public class DCSocketManagerClient extends WebSocketClient {
    6. public static String TAG = "DCSocketManagerClien";
    7. private static volatile DCSocketManagerClient client = null;
    8. public static DCSocketManagerClient getInstance(URI uri) {
    9. if (client == null) {
    10. synchronized (DCSocketManagerClient.class) {
    11. if (client == null) {
    12. client = new DCSocketManagerClient(uri);
    13. }
    14. }
    15. }
    16. return client;
    17. }
    18. public DCSocketManagerClient(URI serverUri) {
    19. super(serverUri);
    20. }
    21. @Override
    22. public void onOpen(ServerHandshake handshakedata) {
    23. }
    24. @Override
    25. public void onMessage(String message) {
    26. }
    27. @Override
    28. public void onClose(int code, String reason, boolean remote) {
    29. }
    30. @Override
    31. public void onError(Exception ex) {
    32. }
    33. }

    启动服务端:

    1. serverSocketManager = ServerSocketManager.getInstance()
    2. serverSocketManager!!.start()

    启动客户端:

    1. val uri = URI.create("ws://127.0.0.1:8888")
    2. clientSocketManager = DCSocketManagerClient.getInstance(uri)
    3. try {
    4. clientSocketManager?.connectBlocking()
    5. } catch (e: Exception) {
    6. e.printStackTrace()
    7. }

    客户端发送消息:

    1. if (clientSocketManager != null) {
    2. clientSocketManager!!.send("Java Coffee")
    3. }

    服务端发送消息:

    1. if (serverSocketManager != null) {
    2. serverSocketManager!!.sendMessageToAll("Drink Coffee From ServerMsg")
    3. }

  • 相关阅读:
    Perl5和Perl6对比使用Sigils的差别
    第 42 章 RTC—实时时钟
    金融业信贷风控算法10-神经网络模型
    智云通CRM:销售人员说太多,对吗?
    KMP算法
    [Qualcomm][Voice]语音通话软件框架介绍(翻译)
    2022年十一届认证杯(小美赛)C题思路新鲜出炉
    高可用集群HA、LVS+Keepalived、健康检测
    Kubernetes etcd备份恢复
    python-数据分析-numpy、pandas、matplotlib的常用方法
  • 原文地址:https://blog.csdn.net/ljt2724960661/article/details/134236440