废话不多说直接上代码
首选导入
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;@Overrideprotected 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);}@Overridepublic 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"><Buttonandroid:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="客服端" /><Buttonandroid: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;@Overrideprotected 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服务器URIURI uri = new URI("ws://10.10.10.104:9007");webSocketClient = new WebSocketClient(uri, this);webSocketClient.connect();} catch (URISyntaxException e) {e.printStackTrace();}}/*** @param message 当WebSocket接收到消息时调用此方法*/@Overridepublic void onMessage(final String message) {}/*** @param message 连接打开*/@Overridepublic void onOpen(String message) {}/*** @param message 连接关闭*/@Overridepublic void onClose(String message) {}/*** @param message 出现错误*/@Overridepublic void onError(String message) {}public void sendMessage(String message) {// 发送一个消息到WebSocket服务器if (webSocketClient != null && webSocketClient.isOpen()) {webSocketClient.send(message);}}@Overrideprotected 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;}@Overridepublic void onOpen(ServerHandshake handshakeData) {System.out.println("WebSocket 连接打开");if (webSocketListener != null) {webSocketListener.onOpen("WebSocket 连接打开");}}@Overridepublic void onMessage(String message) {if (webSocketListener != null) {webSocketListener.onMessage(message);}}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("WebSocket 连接关闭");if (webSocketListener != null) {webSocketListener.onClose("WebSocket 连接关闭");}}@Overridepublic 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;@Overrideprotected 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();}@Overridepublic void onClientOpen(WebSocket conn, String address) {runOnUiThread(() -> {// 更新UI显示连接的客户端的地址// 例如:更新一个文本视图来显示已连接tv_state.setText(address);});}@Overridepublic void onClientClose(WebSocket conn, int code, String reason, boolean remote) {runOnUiThread(() -> {// 更新UI以表示客户端断开连接// 例如:更新列表视图中的项目tv_state.setText("客户端以断开");});}@Overridepublic void onClientMessage(WebSocket conn, String message) {runOnUiThread(() -> {// 在UI上展示收到的消息// 例如:将消息添加到聊天窗口tv_state.setText(message);});}@Overridepublic void onClientError(WebSocket conn, Exception ex) {runOnUiThread(() -> {// 在UI上展示错误信息// 例如:展示一个错误弹窗});}@Overridepublic void onServerStart() {runOnUiThread(() -> {// 更新UI表示服务器已经启动// 例如:改变一个文本视图的文本tv_state.setText("服务器已启动");});}@Overrideprotected 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 {// 事件监听器,用于将事件通知给ServiceActivityprivate 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));}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {// 客户端连接打开时调用监听器的onClientOpen方法String address = conn.getRemoteSocketAddress().getAddress().getHostAddress();serviceWebSocketListener.onClientOpen(conn, address);}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {// 客户端连接关闭时调用监听器的onClientClose方法String address = conn.getRemoteSocketAddress().getAddress().getHostAddress();serviceWebSocketListener.onClientClose(conn, code, reason, remote);}@Overridepublic void onMessage(WebSocket conn, String message) {// 接收到客户端消息时调用监听器的onClientMessage方法serviceWebSocketListener.onClientMessage(conn, message);}@Overridepublic void onError(WebSocket conn, Exception ex) {// 连接发生错误时调用监听器的onClientError方法serviceWebSocketListener.onClientError(conn, ex);}@Overridepublic 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