/
ChatServlet.java
94 lines (83 loc) · 2.8 KB
/
ChatServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package org.example.websocket.proprietary;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.annotation.WebServlet;
import org.atmosphere.jboss.as.websockets.WebSocket;
import org.atmosphere.jboss.as.websockets.servlet.WebSocketServlet;
import org.atmosphere.jboss.websockets.Frame;
import org.atmosphere.jboss.websockets.frame.TextFrame;
@SuppressWarnings("serial")
@WebServlet(ChatServlet.SOCKET_PATH)
public class ChatServlet extends WebSocketServlet
{
private static final Logger log = Logger.getLogger(ChatServlet.class.getName());
public static final String SOCKET_PATH = "/socket";
private Map<String, WebSocket> sockets = new HashMap<String, WebSocket>();
private List<ChatMessage> messageHistory = new ArrayList<ChatMessage>();
@Override
protected void onSocketOpened(WebSocket socket) throws IOException
{
log.info("Socket opened [" + socket.getSocketID() + "]");
this.sockets.put(socket.getSocketID(), socket);
writeMessageHistory(socket);
}
private void writeMessageHistory(WebSocket socket)
{
if (!messageHistory.isEmpty())
{
for (ChatMessage message : messageHistory)
{
try
{
socket.writeFrame(TextFrame.from(message.toJSON()));
}
catch (Exception e)
{
log.log(Level.SEVERE, "Could not write message: " + message, e);
}
}
}
}
@Override
protected void onSocketClosed(WebSocket socket)
{
this.sockets.remove(socket.getSocketID());
log.info("Socket closed [" + socket.getSocketID() + "]");
}
@Override
protected void onReceivedFrame(WebSocket socket)
{
try
{
final Frame frame = socket.readFrame();
log.info("Got a frame [" + frame + "] from socket [" + socket.getSocketID() + "]");
if (frame instanceof TextFrame)
{
final String text = ((TextFrame) frame).getText();
log.info("Got message: " + text);
ChatMessage message = new ChatMessage(System.currentTimeMillis(), text);
ChatServlet.this.messageHistory.add(message);
for (Map.Entry<String, WebSocket> entry : sockets.entrySet())
{
try
{
entry.getValue().writeFrame(TextFrame.from(message.toJSON()));
}
catch (Exception e)
{
log.log(Level.SEVERE, "Could not write message: " + message, e);
}
}
}
}
catch (IOException ex)
{
log.log(Level.SEVERE, "Error reading frame: " + ex.getMessage(), ex);
}
}
}