体验WebSocket

来源:互联网 发布:淘宝收不到自己的店铺 编辑:程序博客网 时间:2024/06/05 16:09

- WebSocket Javascript Client
- WebSocket Java Client
- WebSocket Server


环境:

java version "1.7.0_71"

pom.xml

  <dependency><groupId>org.eclipse.jetty.websocket</groupId><artifactId>websocket-server</artifactId><version>9.2.8.v20150217</version></dependency>

   <dependency>  <groupId>org.eclipse.jetty.websocket</groupId>  <artifactId>websocket-client</artifactId>  <version>9.2.8.v20150217</version></dependency>


WebSocket Javascript Client

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>WebSocket Test</title><script src="external/jquery/jquery.js"></script><script> $(function() {var wsUri = "ws://localhost:8080/echo";var websocket = new WebSocket(wsUri);websocket.onopen = function(evt) {onOpen(websocket, evt)};websocket.onclose = function(evt) {onClose(evt)};websocket.onmessage = function(evt) {onMessage(websocket, evt)};websocket.onerror = function(evt) {onError(evt)};})function onOpen(websocket, evt) {writeToScreen("CONNECTED");var msg = "test msg";writeToScreen("SENT: " + msg);websocket.send(msg);}function onClose(evt) {writeToScreen("DISCONNECTED");}function onMessage(websocket, evt) {writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data + '</span>');websocket.close();}function onError(evt) {writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);}function writeToScreen(message) {$("#output").append("<p>" + message + "</p>");}</script><body><h2>WebSocket Test</h2><div id="output"></div></body></html>

Ref: http://www.websocket.org/echo.html


WebSocket Java Client

package examples;import java.net.URI;import java.util.concurrent.TimeUnit;import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;import org.eclipse.jetty.websocket.client.WebSocketClient;/** * Example of a simple Echo Client. */public class SimpleEchoClient {     public static void main(String[] args) {    String destUri = "ws://localhost:8080/echo";        if (args.length > 0) {            destUri = args[0];        }        WebSocketClient client = new WebSocketClient();        SimpleEchoSocket socket = new SimpleEchoSocket();        try {            client.start();            URI echoUri = new URI(destUri);            ClientUpgradeRequest request = new ClientUpgradeRequest();            client.connect(socket, echoUri, request);            System.out.printf("Connecting to : %s%n", echoUri);            socket.awaitClose(50, TimeUnit.SECONDS);        } catch (Throwable t) {            t.printStackTrace();        } finally {            try {                client.stop();            } catch (Exception e) {                e.printStackTrace();            }        }    }}


package examples; import java.util.concurrent.CountDownLatch;import java.util.concurrent.Future;import java.util.concurrent.TimeUnit;import org.eclipse.jetty.websocket.api.Session;import org.eclipse.jetty.websocket.api.StatusCode;import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;import org.eclipse.jetty.websocket.api.annotations.WebSocket; /** * Basic Echo Client Socket */@WebSocket(maxTextMessageSize = 64 * 1024)public class SimpleEchoSocket {     private final CountDownLatch closeLatch;     @SuppressWarnings("unused")    private Session session;     public SimpleEchoSocket() {        this.closeLatch = new CountDownLatch(1);    }     public boolean awaitClose(int duration, TimeUnit unit) throws InterruptedException {        return this.closeLatch.await(duration, unit);    }     @OnWebSocketClose    public void onClose(int statusCode, String reason) {        System.out.printf("Connection closed: %d - %s%n", statusCode, reason);        this.session = null;        this.closeLatch.countDown();    }     @OnWebSocketConnect    public void onConnect(Session session) {        System.out.printf("Got connect: %s%n", session);        this.session = session;        try {            Future<Void> fut;            fut = session.getRemote().sendStringByFuture("Hello");            fut.get(20, TimeUnit.SECONDS);            fut = session.getRemote().sendStringByFuture("Thanks for the conversation.");            fut.get(20, TimeUnit.SECONDS);            session.close(StatusCode.NORMAL, "I'm done");        } catch (Throwable t) {            t.printStackTrace();        }    }     @OnWebSocketMessage    public void onMessage(String msg) {        System.out.printf("Got msg: %s%n", msg);    }}

Ref: http://www.eclipse.org/jetty/documentation/current/jetty-websocket-client-api.html


WebSocket Server :

import org.eclipse.jetty.server.Server;import org.eclipse.jetty.server.handler.DefaultHandler;import org.eclipse.jetty.server.handler.HandlerList;import org.eclipse.jetty.servlet.ServletContextHandler;import org.eclipse.jetty.servlet.ServletHolder;public class WebServer {public static void main(String[] args) {Server server = new Server(8080);  try {    HandlerList handlerList = new HandlerList();      ServletContextHandler context = new ServletContextHandler(              ServletContextHandler.SESSIONS);      context.setContextPath("/");    context.addServlet(new ServletHolder(new MyEchoServlet()), "/echo");      handlerList.addHandler(context);      handlerList.addHandler(new DefaultHandler());      server.setHandler(handlerList);      server.start();      server.join();  } catch (Exception e) {        e.printStackTrace();  }  }}

import javax.servlet.annotation.WebServlet;import org.eclipse.jetty.websocket.servlet.WebSocketServlet;import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;@SuppressWarnings("serial")@WebServlet(name = "MyEcho WebSocket Servlet", urlPatterns = { "/echo" })public class MyEchoServlet extends WebSocketServlet {    @Override    public void configure(WebSocketServletFactory factory) {        factory.getPolicy().setIdleTimeout(10000);        factory.register(MyEchoSocket.class);            }}

import java.io.IOException;import org.eclipse.jetty.websocket.api.Session;import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;import org.eclipse.jetty.websocket.api.annotations.WebSocket; /** * Basic Echo Socket */@WebSocket(maxTextMessageSize = 64 * 1024)public class MyEchoSocket {     private Session session;     public MyEchoSocket() {    }     @OnWebSocketClose    public void onClose(int statusCode, String reason) {        System.out.printf("Connection closed: %d - %s%n", statusCode, reason);        this.session = null;    }     @OnWebSocketConnect    public void onConnect(Session session) {        System.out.printf("Got connect: %s%n", session);        this.session = session;    }    @OnWebSocketMessage    public void onMessage(String msg) {        System.out.printf("Got msg: %s%n", msg);        try {session.getRemote().sendString("RESPONSE : " + msg);} catch (IOException e) {e.printStackTrace();}    }}
Ref: http://www.eclipse.org/jetty/documentation/current/jetty-websocket-server-api.html



0 0