此篇文章使用的是tomcat包下的类来实现简单的Java websocket 服务端和客户端。
1 引入包依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2 创建服务端
主要使用@ServerEndpoint、@OnOpen、@OnMessage、@OnClose、@OnError这几个注解,对应的方法里可以带下面的参数,当然也可以为空,具体需要由开发者定。
注解 | 释义 | 参数 |
---|---|---|
@ServerEndpoint | 注册端点 | |
@OnOpen | 连接时调用 | Session,EndpointConfig |
@OnMessage | 收到消息调用 | Session,String |
@OnClose | 连接关闭时调用 | Session,CloseReason |
@OnError | 发生错误时调用 | Session,Throwable |
2.1 端点发布
使用ServerEndpointExporter发布由@ServerEndpoint定义的端点。
@Configuration
public class JxConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
2.2 定义连接端点
使用@ServerEndpoint注解定义一个端点,且要用@Component注解交由spring 框架管理,不然此端点无法发布使用。
@Component
@ServerEndpoint("/jx/{name}")
public class Server {
@OnOpen
public void onOpen(Session session, @PathParam("name") String name) {
System.out.println("名称:" + name);
System.out.println(session.getId() + "客户端连接");
}
@OnClose
public void onClose(Session session, CloseReason reason) {
System.out.println("client关闭");
System.out.println("关闭原因:" + reason.getCloseCode() + reason.getReasonPhrase());
}
@OnMessage
public void onMessage(Session session, String msg) {
System.out.println("client" + session.getId() + "接收到的消息:" + msg);
try {
//返回消息给客户端
session.getBasicRemote().sendText("服务端收到消息:" + msg);
} catch (IOException e) {
e.printStackTrace();
}
}
@OnError
public void onError(Session session, Throwable throwable) {
System.out.println(session.getId() + "发生错误");
throwable.printStackTrace();
}
}
3 创建客户端
客户端与服务端基本是一样的,主要使用@ClientEndpoint来声明一个客户端,其他操作也是用@OnOpen、@OnMessage、@OnClose、@OnError这几个注解。
@ClientEndpoint
public class Client {
@OnOpen
public void onOpen(Session session) {
System.out.println(session.getId()+"客户端连接");
}
@OnClose
public void onClose() {
System.out.println("client关闭");
}
@OnMessage
public void onMessage(String msg, Session session) {
System.out.println("client" + session.getId() + "接收到的消息:" + msg);
}
public static void main(String[] args) {
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
Session session = container.connectToServer(Client.class, URI.create("ws://localhost:8080/jx/tom"));
//控制台输入消息
Scanner scanner = new Scanner(System.in);
String msg;
//输入quit退出
while (!"quit".equals(msg = scanner.nextLine())) {
session.getBasicRemote().sendText(msg);
}
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
网友评论