本文从websocket服务端和客户端两个方面简单介绍下websocket在java中的使用。
一、websocket服务端(WebSocketServer)
websocket服务端是以本机作为消息的接受端,用于接受客户端websocket发送过来的消息,并可以通过客户端的websocket对象来反馈消息给websocket客户端,以下为websocket服务端创建步骤。
创建myWebSocketServer.java
类,并继承WebSocketServer
,并实现内部的5个方法,初始代码如下
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;public class myWebSocketServer extends WebSocketServer {@Overridepublic void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {}@Overridepublic void onClose(WebSocket webSocket, int i, String s, boolean b) {}@Overridepublic void onMessage(WebSocket webSocket, String s) {}@Overridepublic void onError(WebSocket webSocket, Exception e) {}@Overridepublic void onStart() {}
}
onOpen
方法会在客户端websocket连接上当前服务端时调用,参数webSocket代表的就是客户端的websocket对象,可以通过该对象发送消息给客户端,也可以通过该对象获取客户端的ip地址等信息。
onClose
方法是当客户端断开连接时调用
onMessage
方法则是客户端向服务端发送消息时调用,其中webSocket参数表明发送消息的客户端,字符串s表示所发送的消息
onError
方法是当客户端和当前服务端通信出现异常时调用
onStart
方法则是服务端开启时调用
为此,我们可以实现简单的一些功能
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;public class myWebSocketServer extends WebSocketServer {// 定义有参构造器,用于服务端websocket的创建public myWebSocketServer(String ip,Integer port){super(new InetSocketAddress(ip,port));}// 定义一个集合用来存储和当前websocket服务器保持连接的websocket客户端List<WebSocket> onLine = new ArrayList<>();@Overridepublic void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {System.out.println("有新的websocket客户端连接:"+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort());// 当有客户端连接将其加入onLine集合中onLine.add(webSocket);}@Overridepublic void onClose(WebSocket webSocket, int i, String s, boolean b) {System.out.println("websocket客户端断开连接:"+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort());// 当有客户端断开连接将其从onLine集合中移除onLine.remove(webSocket);}@Overridepublic void onMessage(WebSocket webSocket, String s) {System.out.println("收到客户端 "+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 发送过来的消息:"+s);// 向客户端回馈消息webSocket.send("收到");// 亦可以群发消息for (WebSocket socket : onLine) {socket.send(webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 群发消息:"+s);}}@Overridepublic void onError(WebSocket webSocket, Exception e) {System.out.println("和客户端 "+webSocket.getRemoteSocketAddress().getHostName()+":"+webSocket.getRemoteSocketAddress().getPort()+" 通信发生异常");}@Overridepublic void onStart() {System.out.println("websocket服务端已启动");}
}
websocket客户端(WebSocketClient)
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;import java.net.URI;public class myWebSocketClient extends WebSocketClient {public myWebSocketClient(URI serverUri) {super(serverUri);}@Overridepublic void onOpen(ServerHandshake serverHandshake) {System.out.println("websocket成功连接");}@Overridepublic void onMessage(String s) {System.out.println("收到服务端发送的消息:"+s);}@Overridepublic void onClose(int i, String s, boolean b) {System.out.println("已经和服务端断开连接");}@Overridepublic void onError(Exception e) {System.out.println("和服务端通信发送异常");}
}
websocket客户端实现的方法含义和服务端一样
服务端和客户端通信测试
创建测试类
public class webSocketTest {public static void main(String[] args) throws Exception {// 创建服务端websocket对象myWebSocketServer server = new myWebSocketServer("127.0.0.1",8899);// 启动服务端websocketserver.start();// 循环启动多个客户端连接服务端for (int i = 0;i<4;i++) {// 连接服务端websocket的地址URI uri = new URI("ws://127.0.0.1:8899");// 创建客户端websocket对象myWebSocketClient client = new myWebSocketClient(uri);// 阻塞式连接client.connectBlocking();// 向服务端发送消息client.send("我是客户端"+i);}}
}
执行结果