java实现web socket聊天
时间: 2023-10-10 10:11:12 浏览: 58
Web Socket 是一种用于实现浏览器与服务器全双工通信的协议,支持双向实时通信。在 Java 中实现 Web Socket 聊天可以使用 Java API for WebSocket(JSR-356)实现。
以下是一个简单的 Web Socket 聊天室的示例:
1. 创建一个聊天处理程序 ChatHandler,继承自 javax.websocket.Endpoint 和 javax.websocket.MessageHandler.Partial 接口:
```
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
public class ChatHandler extends Endpoint implements MessageHandler.Partial<String> {
private Session session;
@Override
public void onOpen(Session session, EndpointConfig config) {
this.session = session;
session.addMessageHandler(this);
}
@Override
public void onMessage(String message, boolean last) {
try {
// 发送消息给所有连接的客户端
for (Session s : session.getOpenSessions()) {
if (s.isOpen()) {
s.getBasicRemote().sendText(message, last);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onMessage(ByteBuffer message, boolean last) {
throw new UnsupportedOperationException("Binary messages not supported.");
}
}
```
2. 创建一个 WebSocket 端点 ChatEndpoint,继承自 javax.websocket.server.ServerEndpoint:
```
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/chat", encoders = {MessageEncoder.class}, decoders = {MessageDecoder.class})
public class ChatEndpoint {
// 该注解会自动创建 ChatHandler 实例,并将其添加到 WebSocket 会话中
}
```
3. 创建一个消息编码器 MessageEncoder 和一个消息解码器 MessageDecoder,用于在客户端与服务器之间转换消息:
```
import javax.json.Json;
import javax.json.JsonObject;
import javax.websocket.EncodeException;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;
public class MessageEncoder implements Encoder.Text<Message> {
@Override
public String encode(Message message) throws EncodeException {
JsonObject jsonObject = Json.createObjectBuilder()
.add("sender", message.getSender())
.add("content", message.getContent())
.build();
return jsonObject.toString();
}
@Override
public void init(EndpointConfig config) {}
@Override
public void destroy() {}
}
```
```
import java.io.StringReader;
import javax.json.Json;
import javax.json.JsonObject;
import javax.websocket.DecodeException;
import javax.websocket.Decoder;
import javax.websocket.EndpointConfig;
public class MessageDecoder implements Decoder.Text<Message> {
@Override
public Message decode(String s) throws DecodeException {
JsonObject jsonObject = Json.createReader(new StringReader(s)).readObject();
return new Message(jsonObject.getString("sender"), jsonObject.getString("content"));
}
@Override
public boolean willDecode(String s) {
try {
Json.createReader(new StringReader(s)).readObject();
return true;
} catch (Exception e) {
return false;
}
}
@Override
public void init(EndpointConfig config) {}
@Override
public void destroy() {}
}
```
4. 创建一个消息类 Message,用于表示聊天消息:
```
public class Message {
private String sender;
private String content;
public Message(String sender, String content) {
this.sender = sender;
this.content = content;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
```
5. 在 HTML 页面中使用 JavaScript 创建 WebSocket 连接并发送和接收消息:
```
<script>
var websocket = new WebSocket("ws://localhost:8080/chat");
websocket.onopen = function(event) {
console.log("WebSocket connected.");
};
websocket.onmessage = function(event) {
var message = JSON.parse(event.data);
console.log("Received message: " + message.content);
};
function sendMessage() {
var message = document.getElementById("messageInput").value;
websocket.send(JSON.stringify({sender: "user", content: message}));
console.log("Sent message: " + message);
}
</script>
```
6. 将 ChatEndpoint、ChatHandler、MessageEncoder、MessageDecoder 和 Message 类打包成一个 WAR 文件,并部署到 Tomcat 或 Jetty 中。
这样就可以在浏览器中访问 HTML 页面,通过 WebSocket 实现实时聊天了。