安卓websocket(客服端和服务端写在app端) 案例

废话不多说直接上代码

首选导入

复制代码
    implementation "org.java-websocket:Java-WebSocket:1.4.0"
java 复制代码
package com.zx.qnncpds.androidwbsocket;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import com.zx.qnncpds.androidwbsocket.client.ClientActivity;
import com.zx.qnncpds.androidwbsocket.service.ServiceActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn1;
    private Button btn2;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = findViewById(R.id.btn1);
        btn2 = findViewById(R.id.btn2);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1://客户端

                startActivity(new Intent(MainActivity.this, ClientActivity.class));
                break;
            case R.id.btn2://服务端
                startActivity(new Intent(MainActivity.this, ServiceActivity.class));

                break;

            default:
                break;
        }
    }
}

布局

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="客服端" />


    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="服务端" />
</LinearLayout>

客服端

java 复制代码
package com.zx.qnncpds.androidwbsocket.client;

import androidx.appcompat.app.AppCompatActivity;

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

import com.zx.qnncpds.androidwbsocket.R;

import java.net.URI;
import java.net.URISyntaxException;

public class ClientActivity extends AppCompatActivity implements ClientWebSocketListener {
    private WebSocketClient webSocketClient;

   private Button btn_send;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client);
        btn_send=findViewById(R.id.btn_send);
        btn_send.setOnClickListener(v -> sendMessage("测试消息"));
        try {
            // 替换为你的WebSocket服务器URI
            URI uri = new URI("ws://10.10.10.104:9007");
            webSocketClient = new WebSocketClient(uri, this);
            webSocketClient.connect();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param message 当WebSocket接收到消息时调用此方法
     */
    @Override
    public void onMessage(final String message) {

    }

    /**
     * @param message 连接打开
     */
    @Override
    public void onOpen(String message) {

    }

    /**
     * @param message 连接关闭
     */
    @Override
    public void onClose(String message) {

    }

    /**

     * @param message 出现错误
     */
    @Override
    public void onError(String message) {

    }

    public void sendMessage(String message) {
        // 发送一个消息到WebSocket服务器
        if (webSocketClient != null && webSocketClient.isOpen()) {
            webSocketClient.send(message);
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 关闭WebSocket连接以避免内存泄露
        if (webSocketClient != null) {
            webSocketClient.close();
        }
    }
}
java 复制代码
package com.zx.qnncpds.androidwbsocket.client;

public interface ClientWebSocketListener {
    /**
     * @param message 当WebSocket接收到消息时调用此方法
     */
    void onMessage(final String message);

    /**
     * @param message 连接打开
     */
    void onOpen(final String message);

    /**
     * @param message 连接关闭
     */
    void onClose(final String message);

    /**
     * @param message 出现错误
     */
    void onError(final String message);
}
java 复制代码
package com.zx.qnncpds.androidwbsocket.client;

import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;

public class WebSocketClient extends org.java_websocket.client.WebSocketClient {

    private ClientWebSocketListener webSocketListener;

    public WebSocketClient(URI serverUri, ClientWebSocketListener listener) {
        super(serverUri);
        this.webSocketListener = listener;
    }

    @Override
    public void onOpen(ServerHandshake handshakeData) {
        System.out.println("WebSocket 连接打开");
        if (webSocketListener != null) {
            webSocketListener.onOpen("WebSocket 连接打开");
        }
    }

    @Override
    public void onMessage(String message) {
        if (webSocketListener != null) {
            webSocketListener.onMessage(message);
        }
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("WebSocket 连接关闭");
        if (webSocketListener != null) {
            webSocketListener.onClose("WebSocket 连接关闭");
        }

    }

    @Override
    public void onError(Exception ex) {
        System.out.println("WebSocket 出现错误: " + ex.getMessage());
        if (webSocketListener != null) {
            webSocketListener.onError("WebSocket 出现错误: " + ex.getMessage());
        }
    }
}

服务端

java 复制代码
package com.zx.qnncpds.androidwbsocket.service;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import com.zx.qnncpds.androidwbsocket.R;

import org.java_websocket.WebSocket;

import java.io.IOException;

public class ServiceActivity extends Activity implements ServiceWebSocketListener {
    // WebSocket服务器的实例
    private AndroidWebSocketServer server;
    private TextView tv_state;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_service);

        tv_state=findViewById(R.id.tv_state);
        // 创建并启动WebSocket服务器
        server = new AndroidWebSocketServer(8887, this);
        server.start();
    }

    @Override
    public void onClientOpen(WebSocket conn, String address) {
        runOnUiThread(() -> {
            // 更新UI显示连接的客户端的地址
            // 例如:更新一个文本视图来显示已连接
            tv_state.setText(address);
        });
    }

    @Override
    public void onClientClose(WebSocket conn, int code, String reason, boolean remote) {
        runOnUiThread(() -> {
            // 更新UI以表示客户端断开连接
            // 例如:更新列表视图中的项目
            tv_state.setText("客户端以断开");
        });
    }

    @Override
    public void onClientMessage(WebSocket conn, String message) {
        runOnUiThread(() -> {
            // 在UI上展示收到的消息
            // 例如:将消息添加到聊天窗口
            tv_state.setText(message);
        });
    }

    @Override
    public void onClientError(WebSocket conn, Exception ex) {
        runOnUiThread(() -> {
            // 在UI上展示错误信息
            // 例如:展示一个错误弹窗
        });
    }

    @Override
    public void onServerStart() {
        runOnUiThread(() -> {
            // 更新UI表示服务器已经启动
            // 例如:改变一个文本视图的文本
            tv_state.setText("服务器已启动");
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (server != null) {
            try {
                server.stop();
            } catch (IOException | InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }


    // 广播消息给所有WebSocket客户端
    public void broadcastToAll(String message) {
        server.broadcastMessage(message);
    }

    // 发送消息给特定的WebSocket客户端
    public void sendToClient(WebSocket client, String message) {
        server.sendMessageToClient(client, message);
    }
}
java 复制代码
package com.zx.qnncpds.androidwbsocket.service;


import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

import java.net.InetSocketAddress;

public class AndroidWebSocketServer extends WebSocketServer {
    // 事件监听器,用于将事件通知给ServiceActivity
    private ServiceWebSocketListener serviceWebSocketListener;
    /**
     * 构造函数。
     * @param port 服务器侦听的端口号。
     * @param serviceWebSocketListener 事件发生时的回调监听器。
     */
    public AndroidWebSocketServer(int port, ServiceWebSocketListener serviceWebSocketListener) {
        super(new InetSocketAddress(port));
        this.serviceWebSocketListener = serviceWebSocketListener;
    }

    public AndroidWebSocketServer(int port) {
        super(new InetSocketAddress(port));
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        // 客户端连接打开时调用监听器的onClientOpen方法
        String address = conn.getRemoteSocketAddress().getAddress().getHostAddress();
        serviceWebSocketListener.onClientOpen(conn, address);
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        // 客户端连接关闭时调用监听器的onClientClose方法
        String address = conn.getRemoteSocketAddress().getAddress().getHostAddress();
        serviceWebSocketListener.onClientClose(conn, code, reason, remote);
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        // 接收到客户端消息时调用监听器的onClientMessage方法
        serviceWebSocketListener.onClientMessage(conn, message);
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        // 连接发生错误时调用监听器的onClientError方法
        serviceWebSocketListener.onClientError(conn, ex);
    }

    @Override
    public void onStart() {
        // WebSocket服务器启动时调用监听器的onServerStart方法
        serviceWebSocketListener.onServerStart();
    }

    // 发送消息到所有连接的WebSocket客户端
    public void broadcastMessage(String message) {
        broadcast(message);
    }

    // 发送消息到特定的WebSocket客户端
    public void sendMessageToClient(WebSocket conn, String message) {
        if (conn != null) {
            conn.send(message);
        }
    }
}
java 复制代码
package com.zx.qnncpds.androidwbsocket.service;

import org.java_websocket.WebSocket;

public interface ServiceWebSocketListener {
    /**当客户端连接打开时调用
     * @param conn
     * @param address
     */
    void onClientOpen(WebSocket conn, String address);
    // 当客户端连接关闭时调用

    /** 当客户端连接关闭时调用
     * @param conn
     * @param code
     * @param reason
     * @param remote
     */
    void onClientClose(WebSocket conn, int code, String reason, boolean remote);

    /**当接收到客户端消息时调用
     * @param conn
     * @param message
     */
    void onClientMessage(WebSocket conn, String message);

    /**
     *  当客户端连接发生错误时调用
     * @param conn
     * @param ex
     */
    void onClientError(WebSocket conn, Exception ex);

    /**
     *当WebSocket服务器启动时调用
     */
    void onServerStart();
}

布局加一个文本这就不写了(服务端和客服端都一样)

项目案例 https://download.csdn.net/download/qq_41733851/88885469?spm=1001.2014.3001.5503

相关推荐
疯狂吧小飞牛7 小时前
GPG基础指令
linux·服务器·网络
小饕7 小时前
苏格拉底式提问对抗315 AI投毒:实操指南
网络·人工智能
斯安8 小时前
车载总线与网络总结
网络
czxyvX8 小时前
009-数据链路层
网络
源远流长jerry8 小时前
RDMA 基本操作类型详解:从双端通信到单端直访
linux·网络·tcp/ip·ip
森林猿8 小时前
java-modbus-读取-modbus4j
java·网络·python
csdn_aspnet8 小时前
AD域网络位置异常深度排错指南:从DNS到GPO的完整诊断链
网络·ad·dns··netlogon
Simon_lca9 小时前
突破合规瓶颈:ZDHC Supplier to Zero(工厂零排放 - 进阶型)体系全攻略
大数据·网络·人工智能·分类·数据挖掘·数据分析·零售
黄焖鸡能干四碗10 小时前
网络安全建设实施方案(Word文件参考下载)
大数据·网络·人工智能·安全·web安全·制造
天赐学c语言11 小时前
Linux - 应用层自定义协议与序列/反序列化
linux·服务器·网络·c++