`
dftwilson
  • 浏览: 23764 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

websocket协议,用jettyy9实现的一个简单的websocket服务器和客户端

 
阅读更多
websocket协议,用jettyy9实现的一个简单的websocket服务器和客户端  日期:2013-11-22 浏览:17
jetty官网上的例子是不能直接用的,而且有点语焉不详,今天鼓捣了半天,终于弄出来一个可用的server和client,特此分享。

服务端

与常规服务端的初始化、运行代码是一致的,只是这里使用了WebSocketHandler,而不是常规的ServletContextHandler,这个handler里面包含的MyEchoSocket可以处理与客户端的链接、数据传输等事件

代码如下:



java代码
package websocket;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;

public class SimpleWebsocketService
{
    static public class MyEchoSocket implements WebSocketListener
    {
        Session session;
        boolean isInit = false;
        @Override
        public void onWebSocketBinary(byte[] arg0, int arg1, int arg2)
        {
            System.out.println("onWebSocketBinary");


           
        }

        @Override
        public void onWebSocketClose(int arg0, String arg1)
        {
            System.out.println("onWebSocketClose");
           
        }

        @Override
        public void onWebSocketConnect(Session arg0)
        {
            System.out.println("onWebSocketConnect");
            System.out.println(arg0.getUpgradeRequest().getHeader("index"));
//            this.session = arg0;
           
            if(!isInit)
            {
                new sendThread(arg0).start();
            }
        }

        @Override
        public void onWebSocketError(Throwable arg0)
        {
            System.out.println("onWebSocketError");
           
        }

        @Override
        public void onWebSocketText(String arg0)
        {
            System.out.println("onWebSocketText, content:" + arg0);
        }

    }
   
    static class sendThread extends Thread
    {
        Session session;
        sendThread(Session session)
        {
            this.session = session;
        }
       
        public void run()
        {
            new Timer().schedule(new TimerTask(){

                @Override
                public void run()
                {
                    Future<Void> fut;
                    fut = session.getRemote().sendStringByFuture("Hello");
                    try
                    {
                        fut.get(2, TimeUnit.SECONDS);
                       
                        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                       
                        fut = session.getRemote().sendStringByFuture(df.format(new Date()));
                        fut.get(2, TimeUnit.SECONDS);
                    }
                    catch (InterruptedException | ExecutionException | TimeoutException e)
                    {
                        e.printStackTrace();
                    }

//                    session.close(StatusCode.NORMAL, "I'm done");
                   
                }}, 1000, 1000);
           
        }
    }

    public static void main(String args[])
    {
        Server server = new Server(7778);
       
        WebSocketHandler  wsHandler = new WebSocketHandler(){
            @Override
            public void configure(WebSocketServletFactory factory)
            {
                factory.register(MyEchoSocket.class);
            }
        };
       
        ContextHandler context = new ContextHandler();
        context.setContextPath("/echo");
        context.setHandler(wsHandler);
       
        server.setHandler(wsHandler);
        try
        {
            server.start();
            server.join();
        }
        catch (Exception e)
        {
           
            e.printStackTrace();
        }
       
    }

}


websocket的客户端链接与普通的http client相仿,但是client要用websocket特有的WebSocketClient,需要实现WebSocketListener接口,才能与服务端互连



java代码
package websocket;

import java.net.URI;
import java.util.concurrent.TimeUnit;

import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
import org.eclipse.jetty.websocket.client.WebSocketClient;

public class SimpleEchoClient
{
    public static void main(String args[])
    {
        String destUri = "ws://10.66.90.79:7778/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();
            request.setHeader("index", "3");
            client.connect(socket, echoUri, request);

            System.out.printf("Connecting to : %s%n", echoUri);
            socket.awaitClose(1000, TimeUnit.SECONDS);
        }
        catch (Throwable t)
        {
            t.printStackTrace();
        }
        finally
        {
            try
            {
                client.stop();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}


java代码
package websocket;

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.WebSocketListener;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;

public class SimpleEchoSocket implements WebSocketListener
{
    private final CountDownLatch closeLatch;


    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 = this.session.getRemote().sendStringByFuture("Hello");
            fut.get(2, TimeUnit.SECONDS);
            fut = session.getRemote().sendStringByFuture("Thanks for the conversation.");
            fut.get(2, TimeUnit.SECONDS);
            this.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);
    }

    @Override
    public void onWebSocketBinary(byte[] arg0, int arg1, int arg2)
    {
        System.out.printf("onWebSocketBinary");
       
    }

    @Override
    public void onWebSocketClose(int arg0, String arg1)
    {
        System.out.printf("onWebSocketClose");
       
    }

    @Override
    public void onWebSocketConnect(Session session)
    {
//        session.getUpgradeRequest()
        System.out.printf("Got connect: %s%n", session);
        this.session = session;
       
        try
        {
            Future<Void> fut;
            fut = session.getRemote().sendStringByFuture("Hello");
            fut.get(2, TimeUnit.SECONDS);
            fut = session.getRemote().sendStringByFuture("Thanks for the conversation.");
            fut.get(2, TimeUnit.SECONDS);
//            session.close(StatusCode.NORMAL, "I'm done");
        }
        catch (Throwable t)
        {
            t.printStackTrace();
        }
       
    }

    @Override
    public void onWebSocketError(Throwable arg0)
    {
        System.out.printf("onWebSocketError");
       
    }

    @Override
    public void onWebSocketText(String arg0)
    {
        System.out.println("onWebSocketText, content:" + arg0);
       
    }
}
分享到:
评论

相关推荐

    c# winform快速建websocket客户端源码 wpf快速搭建websocket客户端 c#简单建立websocket

    WebSocket协议作为一种在单个TCP连接上进行全双工通信的技术,使得客户端和服务器之间能够进行低延迟、高效率的数据交换,非常适合于实时推送通知、在线聊天、游戏实时更新等场景。使用C# WinForm结合WebSocket...

    dotnet-websocketsharp是WebSocket协议客户端和服务器的C实现

    WebSocketSharp是一个开源库,专为.NET开发者提供了对WebSocket协议的支持,允许他们轻松地在C#环境中构建WebSocket客户端和服务器。这个库的名称虽然与标题中的"dotnet-websocketsharp"略有不同,但根据描述和提供...

    简单实现了websocket功能:websocket客户端、winformsocket客户端

    在本项目中,"简单实现了websocket功能:websocket客户端、winformsocket客户端",意味着我们有两个关键部分:WebSocket服务器端和基于WinForm的客户端。 WebSocket客户端通常是一个应用程序,它通过WebSocket协议...

    websocket 客户端 服务器 c c++实现

    WebSocket是一种在客户端和服务器之间建立持久连接的网络协议,它为实时通信提供了低延迟、高效率的解决方案。在Web开发中,WebSocket常用于构建需要双向通信的应用,如在线游戏、实时聊天、股票报价等。 本项目是...

    C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    WebSocket Sharp 是一个C#实现的WebSocket协议库,它支持客户端和服务端的功能,符合RFC 6455标准。这个组件不仅提供了基本的WebSocket连接管理,还包含了一些高级特性,如消息压缩、安全连接、HTTP身份验证、代理...

    c c++实现websocket服务器 c c++实现websocket客户端

    这个代码例子使用了c c++实现了websocket 开发 包含了websocket服务器和websocket客户端,拥有详细的解释 这个库比libwebsocket更加简单方便,比libsocket更加高效便捷.

    WebSocket实现服务器客户端带winform客户端

    C#实现WebSocket源码(c#写的服务端html写的客户端) ...它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

    MFC websocket服务器和客户端

    总的来说,MFC WebSocket服务器和客户端的实现涉及网络编程、协议解析、多线程等技术,是一个综合性的项目。通过这个项目,开发者不仅可以学习到MFC的应用,还能深入理解WebSocket协议的工作原理和实现方式。

    Delphi的WebSocket客户端实现

    在开发基于Delphi的实时通信应用时,WebSocket协议是一个重要的技术选择,因为它提供了一种双向、全双工的通信方式,使得服务器与客户端可以实时交换数据。本篇文章将深入探讨如何在Delphi环境中实现WebSocket客户端...

    webSocket实现Android客户端之间简单的通讯

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任意方向上流动,而无需反复建立和关闭连接。WebSocket协议被广泛应用于实时通信场景,例如在线游戏、聊天应用、...

    websocket_websocket客户端_客户端和服务器通信_websocket_websocket客户端

    在给定的文件中,可能包含了一个简单的WebSocket客户端示例代码或者是一个完整的实现,用于演示如何使用WebSocket进行客户端和服务器之间的通信。这个例子可以帮助开发者理解WebSocket的工作原理,并在自己的项目中...

    C# 开发 websocket 服务端和客户端

    WebSocketSharp是C#中的一个开源库,它为C#开发者提供了一个方便的API来创建WebSocket服务器和客户端。在本项目中,`websocket-sharp`库被用来实现WebSocket的功能。 首先,我们需要理解WebSocket的基本工作流程: ...

    php实现的websocket客户端

    php实现的websocket客户端,不是服务器哦,可以在php代码中与websocket服务器进行简单的通信。通信完成后随着php请求完成关闭连接。经过改造可以实现长连接。测试连接swoole 1.7的websocket服务器没有任何问题。

    Qt实现WebSocket客户端和服务端通信

    在Qt中,我们可以使用`QWebSocket`类来实现WebSocket的客户端和服务器端通信。`QWebSocket`是Qt网络模块的一部分,它为WebSocket协议提供了一个方便的API。 首先,我们来看客户端的实现。在Qt中创建一个WebSocket...

    websocket_for_linux-master_websocket_websocket客户端_WEBSOCKET单片机实现

    8. **单片机实现**: 尽管WebSocket常见于PC和服务器环境,但在资源有限的单片机上实现WebSocket客户端也是一个挑战。这可能需要优化内存管理、减少计算量,选择适合嵌入式系统的轻量级库。 在提供的源码`websocket_...

    WebSocket 协议实现.pdf

    使用 Go 语言可以实现 WebSocket 协议,通过使用 Go 的 net 库和 WebSocket 库,可以快速实现 WebSocket 协议的客户端和服务器端。 六、实验环境 实验环境要求 Go 1.2.1 和 Xfce 终端,实验难度为中级级别,适合...

    c、c++实现websocket服务器及客户端

    这个代码例子使用了c c++实现了websocket 开发 包含了websocket服务器和websocket客户端,拥有详细的解释 这个库比libwebsocket更加简单方便,比libsocket更加高效便捷.

    c++ websocket服务器和html客户端

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任意方向上流动,而无需反复建立新的HTTP请求。WebSocket协议被设计为互联网应用程序提供低延迟、高效率的数据传输...

    php实现websocket客户端

    `websocket_client.php` 可能包含了一个PHP实现的WebSocket客户端类,这个类负责与WebSocket服务器建立连接、发送和接收数据。`demo.php` 可能是一个示例脚本,展示如何使用这个WebSocket客户端类。 WebSocket...

Global site tag (gtag.js) - Google Analytics