Hai kỹ thuật phổ biến, được trình bày ở đây trong khái niệm phòng trò chuyện đơn giản hóa siêu.
Lựa chọn # 1: Có WebSocket báo cáo lại trạng thái của nó đến một vị trí trung tâm
@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
}
}
Sau đó, chỉ cần sử dụng các vị trí trung tâm để nói chuyện với WebSockets bạn đã chọn.
ChatRoom.getInstance().writeSpecificMember("alex", "Hello");
// or
ChatRoom.getInstance().writeAllMembers("Hello all");
Lựa chọn # 2: Đã WebSocket được tạo ra bằng tay với 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));
}
}
Tại thời điểm này, bạn có thể sử dụng các kỹ thuật tương tự như trên để nói chuyện với WebSockets bạn đã chọn.
Nguồn
2013-03-27 00:13:18
Đó không hẳn là máy chủ. Nó sẽ không có ý nghĩa để bắt đầu gửi từ thời điểm đó kể từ khi bạn không biết bạn đang kết nối với ai, trừ khi bạn đang đáp ứng (phục vụ) một ai đó. –
Lý do tôi làm việc với WebSockets là tôi nghĩ rằng đó là một lựa chọn tốt cho các tình huống mà bạn muốn đẩy từ phía máy chủ. MyEchoSocket có thể theo dõi các WebSocketConnections của riêng nó thông qua phương thức onConnect() của nó. Tôi chỉ không biết cách truy cập cá thể MyEchoSocket khi chương trình đang chạy. –
Bạn đang cố gắng thúc đẩy ai? Nếu đó là sau khi ai đó đã kết nối với bạn, sau đó có thể sinh ra một số xử lý không đồng bộ để làm việc đẩy. –