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);
}
}
分享到:
相关推荐
WebSocket协议作为一种在单个TCP连接上进行全双工通信的技术,使得客户端和服务器之间能够进行低延迟、高效率的数据交换,非常适合于实时推送通知、在线聊天、游戏实时更新等场景。使用C# WinForm结合WebSocket...
WebSocketSharp是一个开源库,专为.NET开发者提供了对WebSocket协议的支持,允许他们轻松地在C#环境中构建WebSocket客户端和服务器。这个库的名称虽然与标题中的"dotnet-websocketsharp"略有不同,但根据描述和提供...
在本项目中,"简单实现了websocket功能:websocket客户端、winformsocket客户端",意味着我们有两个关键部分:WebSocket服务器端和基于WinForm的客户端。 WebSocket客户端通常是一个应用程序,它通过WebSocket协议...
WebSocket是一种在客户端和服务器之间建立持久连接的网络协议,它为实时通信提供了低延迟、高效率的解决方案。在Web开发中,WebSocket常用于构建需要双向通信的应用,如在线游戏、实时聊天、股票报价等。 本项目是...
WebSocket Sharp 是一个C#实现的WebSocket协议库,它支持客户端和服务端的功能,符合RFC 6455标准。这个组件不仅提供了基本的WebSocket连接管理,还包含了一些高级特性,如消息压缩、安全连接、HTTP身份验证、代理...
这个代码例子使用了c c++实现了websocket 开发 包含了websocket服务器和websocket客户端,拥有详细的解释 这个库比libwebsocket更加简单方便,比libsocket更加高效便捷.
C#实现WebSocket源码(c#写的服务端html写的客户端) ...它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
总的来说,MFC WebSocket服务器和客户端的实现涉及网络编程、协议解析、多线程等技术,是一个综合性的项目。通过这个项目,开发者不仅可以学习到MFC的应用,还能深入理解WebSocket协议的工作原理和实现方式。
在开发基于Delphi的实时通信应用时,WebSocket协议是一个重要的技术选择,因为它提供了一种双向、全双工的通信方式,使得服务器与客户端可以实时交换数据。本篇文章将深入探讨如何在Delphi环境中实现WebSocket客户端...
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任意方向上流动,而无需反复建立和关闭连接。WebSocket协议被广泛应用于实时通信场景,例如在线游戏、聊天应用、...
在给定的文件中,可能包含了一个简单的WebSocket客户端示例代码或者是一个完整的实现,用于演示如何使用WebSocket进行客户端和服务器之间的通信。这个例子可以帮助开发者理解WebSocket的工作原理,并在自己的项目中...
WebSocketSharp是C#中的一个开源库,它为C#开发者提供了一个方便的API来创建WebSocket服务器和客户端。在本项目中,`websocket-sharp`库被用来实现WebSocket的功能。 首先,我们需要理解WebSocket的基本工作流程: ...
php实现的websocket客户端,不是服务器哦,可以在php代码中与websocket服务器进行简单的通信。通信完成后随着php请求完成关闭连接。经过改造可以实现长连接。测试连接swoole 1.7的websocket服务器没有任何问题。
在Qt中,我们可以使用`QWebSocket`类来实现WebSocket的客户端和服务器端通信。`QWebSocket`是Qt网络模块的一部分,它为WebSocket协议提供了一个方便的API。 首先,我们来看客户端的实现。在Qt中创建一个WebSocket...
8. **单片机实现**: 尽管WebSocket常见于PC和服务器环境,但在资源有限的单片机上实现WebSocket客户端也是一个挑战。这可能需要优化内存管理、减少计算量,选择适合嵌入式系统的轻量级库。 在提供的源码`websocket_...
使用 Go 语言可以实现 WebSocket 协议,通过使用 Go 的 net 库和 WebSocket 库,可以快速实现 WebSocket 协议的客户端和服务器端。 六、实验环境 实验环境要求 Go 1.2.1 和 Xfce 终端,实验难度为中级级别,适合...
这个代码例子使用了c c++实现了websocket 开发 包含了websocket服务器和websocket客户端,拥有详细的解释 这个库比libwebsocket更加简单方便,比libsocket更加高效便捷.
WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任意方向上流动,而无需反复建立新的HTTP请求。WebSocket协议被设计为互联网应用程序提供低延迟、高效率的数据传输...
`websocket_client.php` 可能包含了一个PHP实现的WebSocket客户端类,这个类负责与WebSocket服务器建立连接、发送和接收数据。`demo.php` 可能是一个示例脚本,展示如何使用这个WebSocket客户端类。 WebSocket...