Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解XSockets.NET pubsub:从JavaScript生成和使用消息_Javascript_.net_Websocket_Xsockets.net - Fatal编程技术网

理解XSockets.NET pubsub:从JavaScript生成和使用消息

理解XSockets.NET pubsub:从JavaScript生成和使用消息,javascript,.net,websocket,xsockets.net,Javascript,.net,Websocket,Xsockets.net,假设我有以下示例代码(JavaScript): 客户端B从未收到消息。请注意,这是一个示例代码。您可能认为我没有收到消息,因为客户端A发送消息后客户端B连接上了,但在实际代码中,我是在两个套接字都打开后发布消息的 服务器端xsocketscocontroller正在工作,因为我正在使用它发送服务器通知 我做错了什么?提前谢谢你 看起来你把pub/sub和rpc搞混了,但是我不能确定你是否也发布了服务器端代码 但是你用的是什么版本?3.0.6还是4.0 一旦我知道了版本和服务器端代码,我将编辑这个

假设我有以下示例代码(JavaScript):

客户端B从未收到消息。请注意,这是一个示例代码。您可能认为我没有收到消息,因为客户端A发送消息后客户端B连接上了,但在实际代码中,我是在两个套接字都打开后发布消息的

服务器端
xsocketscocontroller
正在工作,因为我正在使用它发送服务器通知


我做错了什么?提前谢谢你

看起来你把pub/sub和rpc搞混了,但是我不能确定你是否也发布了服务器端代码

但是你用的是什么版本?3.0.6还是4.0

一旦我知道了版本和服务器端代码,我将编辑这个答案并添加一个工作示例

编辑(为3.0.6添加了示例):

刚刚写了一篇与酒吧/酒吧的简单聊天

控制器
使用XSockets.Core.Common.Socket.Event.Interface;
使用XSockets.Core.XSocket;
使用XSockets.Core.XSocket.Helpers;
名称空间演示
{
公共类SampleController:XSocketController
{
/// 
///通过重写onmessage方法,我们得到pub/sub
/// 
/// 
公共覆盖无效消息(ITextArgs textArgs)
{
//将发布到所有订阅textArgs值的客户端。@event
this.SendToAll(textArgs);
}
}
}
HTML/JavaScript

var-conn;
$(函数(){
conn=newxsockets.WebSocket('ws://127.0.0.1:4502/Sample');
conn.onopen=功能(ci){
console.log('open',ci);
接通('say',功能(d){
$('div').prepend($('p>').text(d.text));
});
}
$('input')。在('keydown',函数(e)上{
如果(e.keyCode==13){
conn.publish('say',{text:$(this.val()});
$(this.val(“”);
}
});
});
问候
Uffe

为什么在同一台设备上需要两个连接?@dandavis为什么你认为在同一台设备上会发生这种情况?;)我一直在使用3.x。顺便说一句,我想知道服务器端代码中需要什么。我认为客户端和服务器端代码都可以充当生产者和订阅者。在服务器代码中,我有一个XSocketsController。当我在控制器中添加操作时,我可以在JavaScript中调用
publish
,并从服务器端代码将消息发送给所需的订阅者。但我想知道,连接到控制器并使用任意频道名称发布消息是否足够。在3.0.6中,您可以使用“通用”控制器并在几行代码中执行发布/订阅。我将用完整的JavaScript3.0.6示例更新我的答案!现在我明白它是如何工作的了!谢谢你的努力!;)
// Client A 
var conn = new XSockets.WebSocket([wsUri]);

conn.on(XSockets.Events.open, function (clientInfo) {
    conn.publish("some:channel", { text: "hello world" });
});

// Client B (subscriber) 
var conn = new XSockets.WebSocket([wsUri]);

conn.on(XSockets.Events.open, function (clientInfo) {
    conn.on("some:channel", function(message) {
        // Subscription receives no message!
    });
});
using XSockets.Core.Common.Socket.Event.Interface;
using XSockets.Core.XSocket;
using XSockets.Core.XSocket.Helpers;

namespace Demo
{
    public class SampleController : XSocketController
    {
        /// <summary>
        /// By overriding the onmessage method we get pub/sub
        /// </summary>
        /// <param name="textArgs"></param>
        public override void OnMessage(ITextArgs textArgs)
        {
            //Will publish to all client that subscribes to the value of textArgs.@event            
            this.SendToAll(textArgs);
        }
    }
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="Scripts/jquery-2.1.1.js"></script>
    <script src="Scripts/XSockets.latest.min.js"></script>

    <script>
        var conn;

        $(function() {
            conn = new XSockets.WebSocket('ws://127.0.0.1:4502/Sample');

            conn.onopen = function(ci) {
                console.log('open', ci);
                conn.on('say', function(d) {
                    $('div').prepend($('<p>').text(d.text));
                });
            }

            $('input').on('keydown', function(e) {
                if (e.keyCode == 13) {
                    conn.publish('say', { text: $(this).val() });
                    $(this).val('');
                }
            });
        });
    </script>
</head>
<body>
    <input type="text" placeholder="type and hit enter to send..."/>    
    <div></div>
</body>
</html>