Задать вопрос

Java + вебсокеты, как работать с клиентами?

Здравствуйте, взял пример вот тут
Вот код самого сервера:
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.Collections;

import org.java_websocket.WebSocket;
import org.java_websocket.WebSocketImpl;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_17;
import org.java_websocket.framing.FrameBuilder;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

public class AutobahnServerTest extends WebSocketServer{
   private static int counter = 0;
	
	public AutobahnServerTest( int port , Draft d ) throws UnknownHostException {
		super( new InetSocketAddress( port ), Collections.singletonList( d ) );
	}
	
	public AutobahnServerTest( InetSocketAddress address, Draft d ) {
		super( address, Collections.singletonList( d ) );
	}

	@Override
	public void onOpen( WebSocket conn, ClientHandshake handshake ) {
		counter++;
		System.out.println( "///////////Opened connection number " + counter );
                
	}

	@Override
	public void onClose( WebSocket conn, int code, String reason, boolean remote ) {
		System.out.println( "closed" );
	}

	@Override
	public void onError( WebSocket conn, Exception ex ) {
		System.out.println( "Error:" );
		ex.printStackTrace();
	}

	@Override
	public void onMessage( WebSocket conn, String message ) {
		conn.send( message );
                
	}

	@Override
	public void onMessage( WebSocket conn, ByteBuffer blob ) {
		conn.send( blob );
	}

	@Override
	public void onWebsocketMessageFragment( WebSocket conn, Framedata frame ) {
		FrameBuilder builder = (FrameBuilder) frame;
		builder.setTransferemasked( false );
		conn.sendFrame( frame );
	}

	public static void main( String[] args ) throws  UnknownHostException {
		WebSocketImpl.DEBUG = false;
		int port;
		try {
			port = new Integer( args[ 0 ] );
		} catch ( Exception e ) {
			System.out.println( "No port specified. Defaulting to 1122" );
			port = 1122;
		}
		new AutobahnServerTest( port, new Draft_17() ).start();
	}
}

Алгоритм работы сервера такой, он получает сообщение от клиента и отвечает этому же клиенту его же сообщением.
Вроде все понятно и просто, но у меня есть несколько вопросов:
Как мне отправить сообщение не обратно клиенту, а какому то определенному клиенту?
Как мне разослать одно сообщение всем клиентам?
Можно ли как то отключить определенного клиента?
Заранее большое спасибо!
  • Вопрос задан
  • 430 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Vityarik
@Vityarik
Запоминать в список conn пришедшие в onOpen и удалять из списка на onError onClose

Послать сообщение всем, можно перебрав список c conn
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы