在Android中的org.java_websocket.server.WebSocketServer 的使用,
准备两个对象,一个是客户端的,另一个是服务端的;但在此之前,我们要获取权限和添加引用。
在AndroidManifest.xml中添加权限获取
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在build.gradle中添加这个
implementation 'org.java-websocket:Java-WebSocket:1.5.2'
创建文件(这个就是服务端的):
KMSer
KMSer完整代码
import android.util.Log;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import java.net.InetSocketAddress;
public class KMSer extends WebSocketServer {
public KMSer(InetSocketAddress address)
{
super(address);
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
Log.i("WebSocketServer", "onOpen: " + conn.getRemoteSocketAddress());
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
Log.i("WebSocketServer", "onClose: " + conn.getRemoteSocketAddress());
}
@Override
public void onMessage(WebSocket conn, String message) {
Log.i("WebSocketServer", "服务端接受到消息onMessage: " + conn.getRemoteSocketAddress() + ", message: " + message);
}
@Override
public void onError(WebSocket conn, Exception ex) {
if (conn != null) {
Log.e("WebSocketServer", "onError: " + conn.getRemoteSocketAddress(), ex);
} else {
Log.e("WebSocketServer", "WebSocket connection is null.", ex);
}
}
@Override
public void onStart() {
Log.i("WebSocketServer", "onStart");
}
}
接下来我们准备一个客户端的
创建文件:
KmsServer_in
接下来,往里面添加东西
import android.util.Log;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;
public class KmsServer_in extends WebSocketClient {
private static final String TAG = "KmsServer_in";
public KmsServer_in(String serverUri) throws URISyntaxException {
super(new URI(serverUri));
}
@Override
public void onOpen(ServerHandshake handshake) {
Log.i(TAG, "onOpen");
send("Hello, Server! I'm a KMS client.");
}
@Override
public void onMessage(String message) {
Log.i(TAG, "onMessage: " + message);
}
@Override
public void onClose(int code, String reason, boolean remote) {
Log.i(TAG, "onClose: code=" + code + ", reason=" + reason + ", remote=" + remote);
if (!remote) {
Log.e(TAG, "Connection lost. Reconnecting...");
connect();
}
}
@Override
public void onError(Exception ex) {
Log.e(TAG, "onError: " + ex.getMessage());
ex.printStackTrace();
}
}
准备好服务端和客户端的方法,就要学会调用,但是在Android开发中,我们不能在主线程调用,所以我们要在子线程工作!!!
@Override
protected void onDestroy() {
super.onDestroy();
// 关闭WebSocketServer
if (server != null) {
try {
server.stop();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
//子线程去开启这个端口
private class ServerTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
InetSocketAddress address = new InetSocketAddress("localhost", 8887);
server = new KMSer(address);
server.start();
server.onStart();
return null;
}
}
有了子线程,但还没有调用,所以我们需要写一个调用;
ServerTask serverTask = new ServerTask();
serverTask.execute();
你可以将这段代码插入到onClick方法去调用,我在写的时候是在MainActivity中去调用的,也就是手,我是在一个按钮的点击事件里去调用以开启(创建)服务端的;
接下来我们要学会链接服务端。
这段代码也是可以在onClick里调用
KmsServer_in client = null;
try {
client = new KmsServer_in("ws://localhost:8887");
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
client.connect();
}
最后看日志结果:
这段代码表示服务端接收到了客户端的消息
I/WebSocketServer: onMessage: /127.0.0.1:60200, message: Hello, Server! I'm a KMS client.