socket类
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
/**
* @author xzy
*/
@ServerEndpoint("/testSocket")
public class SocketDemo {
private Session session = null;
/**
* @param session
* @description 监听开始
*/
@OnOpen
public void OnOpen(Session session) {
//开始时应记录当前连接session
this.session = session;
ServiceDemo.sockets.add(this);//在服务器内存中添加当前socket
}
/**
* @description 监听结束
*/
@OnClose
public void onClose() {
//结束时应删除结束的连接session
ServiceDemo.sockets.remove(this);
}
/**
* @param session
* @param error
* @description 监听异常
*/
@OnError
public void OnError(Session session, Throwable error) {
//异常业务操作
error.printStackTrace();
}
/**
* @param message
* @description 监听客户端发给服务器的信息
*/
@OnMessage
public void onMessage(String message) {
System.out.println(message);
}
/**
* @param message
* @throws Exception
* @description 向客户端发送信息
*/
public void sendMessage(String message) throws Exception {
//发送字符串
this.session.getBasicRemote().sendText(message);
//发送二进制数据
// OutputStream os = this.session.getBasicRemote().getSendStream();
// os.write(message.getBytes());
// os.close();
}
}
service类
package com.nju.websocket;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author xzy
*/
public class ServiceDemo extends Thread {
/**
* 所有在线的socket
*/
public final static List<SocketDemo> sockets = new ArrayList<SocketDemo>();
//构造方法保证在类加载时即开始运行服务器
public tests() {
this.start();
}
@Override
public void run() {
int count = 0;
while (!Thread.interrupted()) {
try {
//每间隔一秒钟,遍历所有在线的客户端sockets并按顺序发送消息
for (int i = 0; i < sockets.size(); i++) {
String message = "测试消息!" + count++;
System.out.println("服务器: " + message);
sockets.get(i).sendMessage(message);
}
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
前端
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>webSocket</title>
</head>
<body>
<textarea id="c1" name="c1" >F12看控制台信息!</textarea>
<script>
var reader = new FileReader();
// Create WebSocket connection.
//通信地址: ws://主机IP:端口号/socket项目名/socket请求(即:socketDemo中@ServerEndpoint的值)
const socket = new WebSocket('ws://localhost:8080/wsdemo/testSocket');
// Connection opened 开始通信
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages 监听服务器消息
socket.addEventListener('message', function (event) {
// reader.readAsArrayBuffer(event.data);
console.log('message from server:',event.data );
});
//转换服务器二进制消息
// reader.addEventListener("loadend", function () {
// // reader.result 包含转化为类型数组的blob
// console.log('Message from server:', reader.result);
// });
</script>
</body>
</html>