- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Netty 实现 websockets。我尝试了 DiscardServer 示例,如果我只是使用 Telnet 运行它,它就可以正常工作
Telnet localhost 8090.
因此,无论我在终端窗口中输入什么消息,它都会返回给我。但现在我想在浏览器中实现相同的功能,就像如果我在文本区域中放置一些文本消息,那么它应该在浏览器上显示该文本消息。
我可以使用以下代码启动 websocket 服务器
ChannelFactory factory = new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
ServerBootstrap bootstrap = new ServerBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
return Channels.pipeline(new DiscardServerHandler());
}
});
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.bind(new InetSocketAddress(8090));
但是如何将我的文本区域中的短信与 websocket 服务器绑定(bind)
----已更新----
我已经创建了 MyServerHandler 类
public class MyServerHandler extends SimpleChannelUpstreamHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
Object msg = e.getMessage();
//msg.getClass();
if (msg instanceof HttpRequest) {
//handleHttpRequest(ctx, (HttpRequest) msg);
ctx.getChannel().write(msg);
} else if (msg instanceof WebSocketFrame) {
//handleWebSocketFrame(ctx, (WebSocketFrame) msg);
}
}
}
它调用messageReceived方法,但不执行任何if条件。
我还写了WebSocketServerPipelineFactory类
public class WebSocketServerPipelineFactory implements ChannelPipelineFactory {
@Override
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpChunkAggregator(65536));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("handler", new MyServerHandler());
return pipeline;
}
}
我认为它也没有调用此类的方法。
在我写的jsp文件中
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script>
var MESSAGE_HANDSHAKE = "handshake";
var MESSAGE_OPPONENT_UPDATE = "response";
var MESSAGE_TURN_INDICATOR = "turn";
var MESSAGE_GAME_OVER = "game_over";
var WEBSOCKET_URL = "ws://localhost:8090";
$(document).ready(function() {
ws = new WebSocket(WEBSOCKET_URL);
ws.onopen = function(event) {
alert("test");
$('#status').text("Waiting....");
};
ws.onmessage = function(event) {
var message = jQuery.parseJSON(event.data);
alert(message.type);
}
});
<body>
<p id="status"> </p>
</body>
它不会使用任何 jquery 方法。我还缺少什么吗?
另外,如果我写
ws.send("Test Message");
它抛出以下java脚本错误
Uncaught Error: INVALID_STATE_ERR: DOM Exception 11 login.htm:33
(anonymous function) login.htm:33
f.extend._Deferred.e.resolveWith jquery.min.js:2
e.extend.ready jquery.min.js:2
c.addEventListener.C
如果我使用
var WEBSOCKET_URL = "wss://echo.websocket.org/";
然后它就可以工作了,所以这是我无法连接到我的服务器吗?
我正在使用 eclipse 来运行此代码。我正在使用 Apache Tomcat 运行 jsp 代码,并通过将 WebsocketServer.class 作为 java 应用程序运行来运行 websocket 服务器。这有什么区别吗?
---已更新---
我在 MyServerHandler 类中编写了以下方法,并在浏览器中收到错误
Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
MySeverHandler.java
private void handleHttpRequest(ChannelHandlerContext ctx, HttpRequest req)
throws Exception {
// Allow only GET methods.
if (req.getMethod() != HttpMethod.GET) {
// sendHttpResponse(ctx, req, new DefaultHttpResponse(
// HttpVersion.HTTP_1_1, HttpResponseStatus.FORBIDDEN));
return;
}
// Serve the WebSocket handshake request.
if (req.getUri().equals(WEBSOCKET_PATH)
&& Values.UPGRADE.equalsIgnoreCase(req.getHeader(CONNECTION))
&& WEBSOCKET.equalsIgnoreCase(req.getHeader(Names.UPGRADE))) {
// Create the WebSocket handshake response.
HttpResponse res = new DefaultHttpResponse(
HTTP_1_1,
new HttpResponseStatus(101, "Web Socket Protocol Handshake"));
res.addHeader(Names.UPGRADE, WEBSOCKET);
res.addHeader(CONNECTION, Values.UPGRADE);
// Upgrade the connection and send the handshake response.
ChannelPipeline p = ctx.getChannel().getPipeline();
p.remove("aggregator");
p.replace("decoder", "wsdecoder", new WebSocketFrameDecoder());
// Write handshake response to the channel
ctx.getChannel().write(res);
// Upgrade encoder to WebSocketFrameEncoder
p.replace("encoder", "wsencoder", new WebSocketFrameEncoder());
// Initialize the game. Assign players to a game and assign them a letter (X or O)
///initGame(ctx);
return;
}
// Send an error page otherwise.
sendHttpResponse(ctx, req, new DefaultHttpResponse(
HttpVersion.HTTP_1_1, HttpResponseStatus.FORBIDDEN));
}
最佳答案
Netty 使用责任链设计模式,因此每当您需要使用协议(protocol)时,您都需要在管道中创建适当的解码器/编码器。对于 websocket,这里是一个示例管道。
public class WebSocketServerPipelineFactory implements ChannelPipelineFactory {
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpChunkAggregator(65536));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("handler", new YourBusinessHandler());
return pipeline;
}
}
您可以在业务处理程序中编写任何业务逻辑。在这种情况下,您只需回显收到的内容,因此在此处理程序中它将类似于 channel.write(incomingMessage);
。
看看这个 tic-tac-toe game了解更多信息。 github 上还有很多关于如何执行此操作的链接信息。
关于java - 在浏览器中使用Netty将短信与websocket绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11971694/
我正在尝试使用 Netty 构建一个反向代理,并且我想保留一个到后端服务器的开放套接字池,而不是每个传入套接字都需要一个从反向代理到后端服务器的新套接字。 你能用 Netty 做到这一点吗?如何? 谢
从 Netty 3.5.x 到 Netty 4 性能提升了多少?有数据吗? 最佳答案 目前没有太大改进。不过,它的 GC 开销要少得多。一旦实现缓冲池,我相信吞吐量也会变得更好。目前,吞吐量增益约为
我正在尝试关闭与它建立连接的 Netty 服务器,但它只是挂起。这就是我所做的。 在一台机器上启动服务器,在另一台机器上启动客户端。 从客户端向服务器发送一条消息,我得到响应。 使用 Ctrl-C 关
doc说“每个轮子的默认滴答数(即轮子的大小)是 512。如果你要安排很多超时,你可以指定一个更大的值。” 这是否意味着默认情况下它只能处理 512 次超时?如果我想要 25 秒的 10 万次超时(对
我正在使用 netty 4.0.25Final 编写一个 netty HTTP 服务器。我需要根据 HTTP GET 请求中的一些参数在管道中添加各种处理程序。 pipeline.addLast(ne
我现在将 Netty 用于一些服务器端组件有一段时间了,我对此感到非常满意。因此,为了我自己的方便,我还想在客户端使用它,但我想保持小程序的占用空间(在这种情况下)尽可能小。我需要从 Netty 那里
有没有办法告诉 netty 停止监听和接受套接字上的新连接,但要完成当前连接上的任何正在进行的工作? 最佳答案 您可以关闭 ServerSocketChannel创建者 ChannelFactory
我用响应式(Reactive) mongo 创建了简单的 Webflux (kotlin) 应用程序。 Controller 有一个 GET 方法,即返回 Flow(来自一个集合的 2 个对象)。 我
我有一个新项目,我将第一次使用 Netty (v4.0.4)。我将拥有一个拥有数万个连接客户端的服务器。服务器将向这些客户端发送命令并应该接收响应。 查看 API 和在线示例,我不确定如何从服务器的角
与 boost.asio 不同,netty 没有类似 read 的方法。以下情况不方便:管理节点管理一些节点,客户端连接到管理节点以检索驻留在节点中的信息。当管理节点收到客户端的请求后,向对应的节点发
我正在编写一个应用程序,其中客户端和服务器都是使用 Netty 编写的,并且服务器应该(显然)同时支持多个客户端。我试图通过创建 1000 个客户端共享一个 EventLoopGroup 并在一台机器
如果我在 Netty 101 期间睡着了,请原谅我,但我想知道是否有一种“正确”的方式来等待 Netty 完成多步骤连接过程。假设我有一个应用程序,其过程如下所示: 打开实际连接。 执行 TLS 握手
将 Netty ChannelBuffer 转换为 String 就像在 ChannelBuffer 上调用 .toString(UTF_8) 一样简单。如何从字符串创建 ChannelBuffer?
在 Netty 3 中,我们可以这样做: Channel.setReadable(false); Channel.setReadable(true); 我读了: http://netty.io/new
我知道 Storm 现在运行在 Netty 上用于节点之间的通信? Apache Spark 是否也使用 Netty?如果真是这样,那么是以哪种方式? 最佳答案 Spark使用Akka Actor进行
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我真的很困惑老板组的线程数。我想不出我们需要多个老板线程的情况。在 do we need more than a single thread for boss group? Netty 的创建者说,如
我已将其添加到我的管道中,并且 LoggingHandler 正在捕获其事件,但是由于事件系统从 Netty 3 更改为 4,我该如何处理这些事件,因为 IdleStateAwareUpstreamH
有没有办法在 channel 上保持状态。我正在编写一个聊天服务器,我想保留有关 channel 所属用户的信息。我在想也许 Channel 会提供一种方法来存储用户对象,但我看不到。有没有办法在不需
我有一个 netty channel ,我想在底层套接字上设置超时(默认设置为 0 )。 超时的目的是,如果 15 分钟内没有发生任何事情,则未使用的 channel 将被关闭。 虽然我没有看到任何配
我是一名优秀的程序员,十分优秀!