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

废话不多说直接上代码

首选导入

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

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 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>

客服端

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();
        }
    }
}

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);
}

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());
        }
    }
}

服务端

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);
    }
}

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);
        }
    }
}

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

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C++中,可以使用第三方库来实现WebSocket生产服务端。常用的WebSocket库有:libwebsockets、uWebSockets和Boost.Beast等。 以下是使用libwebsockets库实现WebSocket生产服务端的示例代码: WebSocket服务端: ```c++ #include <libwebsockets.h> #include <string.h> static int callback_echo(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len) { switch (reason) { case LWS_CALLBACK_ESTABLISHED: printf("Connection established\n"); break; case LWS_CALLBACK_RECEIVE: // 从客户接收到消息 printf("Received message: %s\n", (char *) in); // 回复消息给客户 libwebsocket_write(wsi, (unsigned char *) in, strlen((char *) in), LWS_WRITE_TEXT); break; default: break; } return 0; } int main(int argc, char **argv) { struct libwebsocket_context *context; struct libwebsocket_protocols protocols[] = { { "echo-protocol", callback_echo, 0 }, { NULL, NULL, 0 } }; struct lws_context_creation_info info; memset(&info, 0, sizeof info); info.port = 9000; info.protocols = protocols; context = libwebsocket_create_context(&info); if (context == NULL) { printf("Could not create WebSocket context\n"); return 1; } printf("WebSocket server started\n"); while (1) { libwebsocket_service(context, 50); } libwebsocket_context_destroy(context); return 0; } ``` WebSocket生产: ```c++ #include <libwebsockets.h> #include <string.h> static void connect_callback(struct libwebsocket_context *context, struct libwebsocket *wsi, enum libwebsocket_callback_reasons reason, void *user, void *in, size_t len) { if (reason == LWS_CALLBACK_CLIENT_CONNECTION_ERROR) { printf("Connection failed\n"); exit(1); } if (reason == LWS_CALLBACK_CLIENT_ESTABLISHED) { printf("Connection established\n"); // 发送消息给服务端 char *message = "Hello, WebSocket server!"; libwebsocket_write(wsi, (unsigned char *) message, strlen(message), LWS_WRITE_TEXT); } } int main(int argc, char **argv) { struct lws_context_creation_info info; memset(&info, 0, sizeof info); info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = NULL; struct libwebsocket_context *context = libwebsocket_create_context(&info); if (context == NULL) { printf("Could not create WebSocket context\n"); return 1; } struct libwebsocket *wsi = libwebsocket_client_connect(context, "localhost", 9000, 0, "/", "localhost", NULL, NULL, -1); if (wsi == NULL) { printf("Could not connect to WebSocket server\n"); return 1; } printf("Connecting to WebSocket server...\n"); while (1) { libwebsocket_service(context, 50); } libwebsocket_context_destroy(context); return 0; } ``` 注意:以上示例代码仅供参考,实际使用时需要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值