All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jakarta.websocket.Endpoint Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2018, 2022 Oracle and/or its affiliates and others.
 * All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package jakarta.websocket;

/**
 * The Web Socket Endpoint represents an object that can handle websocket conversations. Developers may extend this
 * class in order to implement a programmatic websocket endpoint. The Endpoint class holds lifecycle methods that may be
 * overridden to intercept websocket open, error and close events. By implementing the
 * {@link Endpoint#onOpen(jakarta.websocket.Session, jakarta.websocket.EndpointConfig) onOpen} method, the programmatic
 * endpoint gains access to the {@link Session} object, to which the developer may add {@link MessageHandler}
 * implementations in order to intercept incoming websocket messages. Each instance of a websocket endpoint is
 * guaranteed not to be called by more than one thread at a time per active connection.
 *
 * 

* If deployed as a client endpoint, it will be instantiated once for the single connection to the server. * *

* When deployed as a server endpoint, the implementation uses the * {@code jakarta.websocket.server.ServerEndpointConfig.Configurator#getEndpointInstance} method to obtain the endpoint * instance it will use for each new client connection. If the developer uses the default * {@code jakarta.websocket.server.ServerEndpointConfig.Configurator}, there will be precisely one endpoint instance per * active client connection. Consequently, in this typical case, when implementing/overriding the methods of Endpoint, * the developer is guaranteed that there will be at most one thread calling each endpoint instance at a time. * *

* If the developer provides a custom {@code jakarta.websocket.server.ServerEndpointConfig.Configurator} which overrides * the default policy for endpoint instance creation, for example, using a single Endpoint instance for multiple client * connections, the developer may need to write code that can execute concurrently. * *

* Here is an example of a simple endpoint that echoes any incoming text message back to the sender. * *

 * 
 * public class EchoServer extends Endpoint {
 *
 *     {@literal @}Override
 *     public void onOpen(Session session, EndpointConfig config) {
 *         final RemoteEndpoint.Basic remote = session.getBasicRemote();
 *         session.addMessageHandler(String.class, new MessageHandler.Whole<String>() {
 *             public void onMessage(String text) {
 *                 try {
 *                     remote.sendText("Got your message (" + text + "). Thanks !");
 *                 } catch (IOException ioe) {
 *                     // handle send failure here
 *                 }
 *             }
 *         });
 *     }
 *
 * }
 * 
 * 
* * @author dannycoward */ public abstract class Endpoint { /** * Developers must implement this method to be notified when a new conversation has just begun. *

* Note: *

    *
  • It is permitted to send messages from this method.
  • *
  • It is permitted to add {@link MessageHandler}s from this method. No messages will be * mapped to the appropriate {@link MessageHandler} until this method has completed.
  • *
* * @param session the session that has just been activated. * @param config the configuration used to configure this endpoint. */ public abstract void onOpen(Session session, EndpointConfig config); /** * This method is called immediately prior to the session with the remote peer being closed. It is called whether * the session is being closed because the remote peer initiated a close and sent a close frame, or whether the * local websocket container or this endpoint requests to close the session. The developer may take this last * opportunity to retrieve session attributes such as the ID, or any application data it holds before it becomes * unavailable after the completion of the method. Developers should not attempt to modify the session from within * this method, or send new messages from this call as the underlying connection will not be able to send them at * this stage. * * @param session the session about to be closed. * @param closeReason the reason the session was closed. */ public void onClose(Session session, CloseReason closeReason) { } /** * Developers may implement this method when the web socket session creates some kind of error that is not modeled * in the web socket protocol. This may for example be a notification that an incoming message is too big to handle, * or that the incoming message could not be encoded. * *

* There are a number of categories of exception that this method is (currently) defined to handle: *

    *
  • connection problems, for example, a socket failure that occurs before the web socket connection can be * formally closed. These are modeled as {@link SessionException}s
  • *
  • runtime errors thrown by developer created message handlers calls.
  • *
  • conversion errors encoding incoming messages before any message handler has been called. These are modeled as * {@link DecodeException}s
  • *
* * @param session the session in use when the error occurs. * @param thr the throwable representing the problem. */ public void onError(Session session, Throwable thr) { } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy