Due tecniche comuni, presentate qui in un concetto di chat room super semplificato.
Opzione # 1: Avere WebSocket riferire il suo stato in una posizione centrale
@WebSocket
public class ChatSocket {
public Session session;
@OnWebSocketConnect
public void onConnect(Session session) {
this.session = session;
ChatRoom.getInstance().join(this);
}
@OnWebSocketMessage
public void onText(String message) {
ChatRoom.getInstance().writeAllMembers("Hello all");
}
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
ChatRoom.getInstance().part(this);
}
}
public class ChatRoom {
private static final ChatRoom INSTANCE = new ChatRoom();
public static ChatRoom getInstance()
{
return INSTANCE;
}
private List<ChatSocket> members = new ArrayList<>();
public void join(ChatSocket socket)
{
members.add(socket);
}
public void part(ChatSocket socket)
{
members.remove(socket);
}
public void writeAllMembers(String message)
{
for(ChatSocket member: members)
{
member.session.getRemote().sendStringByFuture(message);
}
}
public void writeSpecificMember(String memberName, String message)
{
ChatSocket member = findMemberByName(memberName);
member.session.getRemote().sendStringByFuture(message);
}
public ChatSocket findMemberByName(String memberName)
{
// left as exercise to reader
}
}
Poi è sufficiente utilizzare la posizione centrale per parlare con i WebSockets di vostra scelta.
ChatRoom.getInstance().writeSpecificMember("alex", "Hello");
// or
ChatRoom.getInstance().writeAllMembers("Hello all");
Opzione # 2: Avere WebSocket essere creato manualmente con WebSocketCreator
@WebSocket
public class ChatSocket {
public ChatRoom chatroom;
public ChatSocket(ChatRoom chatroom)
{
this.chatroom = chatroom;
}
@OnWebSocketConnect
public void onConnect(Session session) {
chatroom.join(this);
}
@OnWebSocketMessage
public void onText(String message) {
chatroom.writeAllMembers(message);
}
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
chatroom.part(this);
}
}
public class ChatCreator implements WebSocketCreator
{
private ChatRoom chatroom;
public ChatCreator(ChatRoom chatroom)
{
this.chatroom = chatroom;
}
public Object createWebSocket(UpgradeRequest request,
UpgradeResponse response)
{
// We want to create the Chat Socket and associate
// it with our chatroom implementation
return new ChatSocket(chatroom);
}
}
public class ChatHandler extends WebSocketHandler
{
private ChatRoom chatroom = new ChatRoom();
@Override
public void configure(WebSocketServletFactory factory)
{
factory.setCreator(new ChatCreator(chatroom));
}
}
A questo punto è possibile utilizzare le stesse tecniche come sopra per parlare con i WebSockets di vostra scelta.
fonte
2013-03-27 00:13:18
Quindi non è esattamente un server. Non avrebbe senso iniziare a inviare da quel momento in quanto non si sa a chi si è connessi, a meno che non si risponda a (servire) qualcuno. –
La ragione per cui lavoro con WebSockets è che ho pensato che fossero una buona scelta per le situazioni in cui si desidera spingere dal lato server. MyEchoSocket può tenere traccia delle proprie WebSocketConnections tramite il suo metodo onConnect(). Solo non so come accedere all'istanza di MyEchoSocket una volta che il programma è in esecuzione. –
Chi stai cercando di spingere? Se è dopo che qualcuno si è connesso a te, allora forse genera un gestore asincrono per fare la spinta. –