GVKun编程网logo

socket.io:客户端发出的回调永远不会触发(socket 回调)

13

本文将为您提供关于socket.io:客户端发出的回调永远不会触发的详细介绍,我们还将为您解释socket回调的相关知识,同时,我们还将为您提供关于aiohttpWebsockets服务器不向所有客户

本文将为您提供关于socket.io:客户端发出的回调永远不会触发的详细介绍,我们还将为您解释socket 回调的相关知识,同时,我们还将为您提供关于aiohttp Websockets 服务器不向所有客户端发送消息、Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit不会触发、C#使用Socket实现一个socket服务器与多个socket客户端通信、ios – CMAltimeter回调永远不会触发的实用信息。

本文目录一览:

socket.io:客户端发出的回调永远不会触发(socket 回调)

socket.io:客户端发出的回调永远不会触发(socket 回调)

仅仅为了概念验证而使用socket.io,到目前为止,一切工作都很好,除了我无法在客户端实现我的emit回调。我必须在这里丢失一些愚蠢的东西,但是文档目前还不是杀手。服务器可以很好地拾取“
getSomeData”事件,并且在任何地方都没有错误。

根据我在客户端socket.io源代码中看到的信息,它检查发出的最后一个参数是否是一个函数,并始终将其用作回调,但是对任何更深层的调试对我来说都是成问题的。

我觉得我这里必须缺少一些核心概念。这不是this.send(..)应该做的吗?在示例应用程序中,我只能发现1种用法,而在该事件发出的客户端代码可用的地方,找不到任何一种用法。

更新 :明确地说,我实际上是故意发出事件客户端的。这样做的目的是查看是否可以使用socket.io来允许客户端除了接收推送外还应请求拉取数据。

服务器:

var io = require(''socket.io'').listen(80);io.sockets.on(''connection'', function (socket) {    socket.on("getSomeData", function() {        this.send({data: "some random data"});    });});

客户端:(console.log永远不会发生)

<script type="text/javascript" src="http://localhost/socket.io/socket.io.js"></script><script type="text/javascript">  var socket = io.connect(''http://localhost'');  socket.emit("getSomeData", function(data) {      console.log(data);  });</script>

答案1

小编典典

看来您已经改变了一些逻辑,请尝试…

var io = require(''socket.io'').listen(80);io.sockets.on(''connection'', function (socket) {    socket.emit("getSomeData",{data: "some random data"});});

和客户…

<script src="http://localhost/socket.io/socket.io.js"></script><script>  var socket = io.connect(''http://localhost'');  socket.on("getSomeData", function(data) {      console.log(data);  });</script>

编辑:

var io = require(''socket.io'').listen(80);io.sockets.on(''connection'', function (socket) {    socket.on("getSomeData", function(name,fn) {        fn({data: "some random data"});    });});

客户

<script src="http://localhost/socket.io/socket.io.js"></script><script>  var socket = io.connect(''http://localhost'');  socket.emit("getSomeData", function(data) {      console.log(data);  });</script>

aiohttp Websockets 服务器不向所有客户端发送消息

aiohttp Websockets 服务器不向所有客户端发送消息

如何解决aiohttp Websockets 服务器不向所有客户端发送消息?

我正在尝试创建一个 Websockets aiohtttp 服务器,该服务器不断侦听消息(来自 Kafka 主题)并将收到的消息发送到所有连接的 websocket 客户端。

但是,当我使用 wscat

将 2 个 websocket 客户端连接到服务器时
$ wscat -c ws://127.0.0.1:1234/channel/general

然后向kafka主题general发送“Hello world”消息,只有第一个websocket客户端收到消息。

服务器也抛出消息:

组 my_group 的心跳失败,因为它正在重新平衡

此外,每当新客户端连接到 websocket 服务器时,创建一个新的 AIOKafkaConsumer 实例似乎非常浪费。

这样做的正确方法是什么?

import asyncio
import collections
from aiohttp import web
from aiokafka import AIOKafkaConsumer

routes = web.RouteTableDef()
websockets = collections.defaultdict(set)

@routes.get("/channel/{topic}")
async def ws_handler(request):
    topic = request.match_info["topic"]
    print(f"Connection opened")
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    websockets[topic].add(ws)

    try:
        await asyncio.gather(listen_to_kafka(ws))
    finally:
        websockets[topic].remove(ws)
        print("Closed connection")

    return ws


async def listen_to_kafka(ws,topic):
    consumer = AIOKafkaConsumer(
        topic,bootstrap_servers="localhost:29092",group_id="my_group"
    )
    await consumer.start()
    while True:
        message = await consumer.getone()
        await ws.send_str(message.value.decode("utf-8"))


app = web.Application(debug=True)
app.add_routes(routes)
web.run_app(app,port=1234)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit不会触发

Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit不会触发

我一直在这个问题上花费数小时,但无济于事。

编辑:find解决scheme(请参阅我的答案)

项目背景

我正在Symfony2构build一个项目,这个项目需要一个上传大文件的模块。 我select了Node.js和Socket.IO (我必须从头学习,所以我可能会缺less一些基本的东西)。 我将它们与HTML5 File和FileReader API结合起来,将切片中的文件从客户端发送到服务器。 初步testing表明,这种方法作为一个独立的应用程序运行良好,一切都由Node.js处理和服务,但与Apache和Symfony2集成似乎有问题。

该应用程序有一个不安全和安全的部分。 我的目标是在端口80和443上使用Apache来为Symfony2构build的应用程序提供大量服务,在端口8080上使用带有Socket.io Node.js来上传文件。 连接到套接字的客户端页面将由Apache ,但套接字将通过Node.js运行。 上传模块必须通过HTTPS运行,因为页面驻留在具有经过身份validation的用户的安全环境中。

问题是事件使用socket.emit或socket.send似乎没有工作。 客户端到服务器,或服务器到客户端,它没有任何区别。 没有任何反应 ,也没有错误。

使用Apache POI的sxssfSheet从xlsx读取数据

该网站负载很重+ ROR

JSON对象的最大大小?

PHP如何与Apache接口?

Apache的子域名代理jenkins在tomcat插入额外的目录

代码

显示的代码是我的代码的简化版本,没有混乱和敏感的数据。

服务器

var httpsModule = require('https'),fs = require('fs'),io = require('socket.io'); var httpsOptions = { key: fs.readFileSync('path/to/key'),cert: fs.readFileSync('/path/to/cert'),passphrase: "1234lol" } var httpsServer = httpsModule.createServer(httpsOptions); var ioServer = io.listen(httpsServer); httpsServer.listen(8080); ioServer.sockets.on('connection',function(socket) { // This event gets bound,but never fires socket.on('NewFile',function(data) { // To make sure something is happening console.log(data); // Process the new file... }); // Oddly,this one does fire socket.on('disconnect',function() { console.log("disconnected"); }); });

客户

// This is a Twig template,so I'll give an excerpt {% block javascripts %} {{ parent() }} <script type="text/javascript" src="https://my.server:8080/socket.io/socket.io.js"></script> <script type="text/javascript"> var socket = io.connect("my.server:8080",{ secure: true,port: 8080 }); // Imagine this is the function initiating the file upload // File is an object containing Metadata about the file like,filename,size,etc. function uploadNewFile(file) { socket.emit("NewFile",item); } </script> {% endblock %}

所以问题是…

当然,还有更多的应用程序比这个,但这是我卡住的地方。 页面加载完美没有错误,但排放事件永远不会触发或到达服务器(断开事件除外)。 我已经尝试了客户端和服务器上的消息事件,以检查是否只有自定义事件的问题,但也没有工作。 我猜测什么是阻止客户端 – 服务器通信(这不是防火墙,我已经检查)。

我完全不知所措,请帮忙。

编辑:find解决scheme(请参阅我的答案)

通过一个脚本在apache下所有的path服务

Apache SetEnv预装了REDIRECT_。 是什么赋予了?

Linux未find包含非ASCII字符的文件名的错误

PHP直接打印到打印机(本地/networking)(卡在打印后台处理程序中)

NodeJS应该是独立的(没有Apache Nginx的IE)

经过一番苦心的调试,我发现我的设置有问题。 不妨分享我的发现,虽然他们(我认为)与Node.js,Socket.IO或Apache无关。

正如我所提到的,我的问题已经简化了代码,向您展示我的设置没有混乱。 不过,我通过一个对象来设置客户端,使用属性来配置套接字连接。 像这样:

var MyProject = {}; MyProject.Uploader = { location: 'my.server:8080',socket: io.connect(location,port: 8080,query: "token=blabla" }),// ...lots of extra properties and methods }

问题在于使用location作为属性名称。 这是Javascript中的一个保留字,在这种情况下会造成一些奇怪的行为。 我发现奇怪的是,一个对象的属性名称不能是保留字,所以我决定测试。 我也注意到我正在引用属性不正确,我忘记连接到套接字时使用this.location 。 所以我把它改成了这个,只是作为一个测试。

var MyProject = {}; MyProject.Uploader = { location: 'my.server:8080',socket: io.connect(this.location,// ...lots of extra properties and methods }

但无济于事。 我仍然没有通过套接字获取数据。 所以下一步似乎是合乎逻辑的,这是我受挫的调试风暴。 改变属性名称固定一切!

var MyProject = {}; MyProject.Uploader = { socketLocation: 'my.server:8080',socket: io.connect(this.socketLocation,// ...lots of extra properties and methods }

这种方法完美运行,我得到了大量的调试消息。 成功!! 不管是Javascript中的预期行为,还是重写(或者这里发生的任何事情,“滥用”,现在都觉得是一种更好的方式)对象属性,如果你碰巧使用了保留字,我不知道。 我只知道我从现在开始避开他们!

希望它能帮助那里的任何人!

C#使用Socket实现一个socket服务器与多个socket客户端通信

C#使用Socket实现一个socket服务器与多个socket客户端通信

  笔记一下知识内容,原文地址:https://www.cnblogs.com/yy3b2007com/p/7476458.html

  server端代码

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace SocketServerAcceptMultipleClient
{
    public class SocketServer
    {
        // 创建一个和客户端通信的套接字
        static Socket socketwatch = null;
        //定义一个集合,存储客户端信息
        static Dictionary<string, Socket> clientConnectionItems = new Dictionary<string, Socket> { };

        public static void Main(string[] args)
        {
            //定义一个套接字用于监听客户端发来的消息,包含三个参数(IP4寻址协议,流式连接,Tcp协议)  
            socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //服务端发送信息需要一个IP地址和端口号  
            IPAddress address = IPAddress.Parse("127.0.0.1");
            //将IP地址和端口号绑定到网络节点point上  
            IPEndPoint point = new IPEndPoint(address, 8098);
            //此端口专门用来监听的  

            //监听绑定的网络节点  
            socketwatch.Bind(point);

            //将套接字的监听队列长度限制为20  
            socketwatch.Listen(20);

            //负责监听客户端的线程:创建一个监听线程  
            Thread threadwatch = new Thread(watchconnecting);

            //将窗体线程设置为与后台同步,随着主线程结束而结束  
            threadwatch.IsBackground = true;

            //启动线程     
            threadwatch.Start();

            Console.WriteLine("开启监听。。。");
            Console.WriteLine("点击输入任意数据回车退出程序。。。");
            Console.ReadKey();
            Console.WriteLine("退出监听,并关闭程序。");
        }

        //监听客户端发来的请求  
        static void watchconnecting()
        {
            Socket connection = null;

            //持续不断监听客户端发来的请求     
            while (true)
            {
                try
                {
                    connection = socketwatch.Accept();
                }
                catch (Exception ex)
                {
                    //提示套接字监听异常     
                    Console.WriteLine(ex.Message);
                    break;
                }

                //获取客户端的IP和端口号  
                IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address;
                int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port;

                //让客户显示"连接成功的"的信息  
                string sendmsg = "连接服务端成功!\r\n" + "本地IP:" + clientIP + ",本地端口" + clientPort.ToString();
                byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsg);
                connection.Send(arrSendMsg);

                //客户端网络结点号  
                string remoteEndPoint = connection.RemoteEndPoint.ToString();
                //显示与客户端连接情况
                Console.WriteLine("成功与" + remoteEndPoint + "客户端建立连接!\t\n");
                //添加客户端信息  
                clientConnectionItems.Add(remoteEndPoint, connection);

                //IPEndPoint netpoint = new IPEndPoint(clientIP,clientPort); 
                IPEndPoint netpoint = connection.RemoteEndPoint as IPEndPoint;

                //创建一个通信线程      
                ParameterizedThreadStart pts = new ParameterizedThreadStart(recv);
                Thread thread = new Thread(pts);
                //设置为后台线程,随着主线程退出而退出 
                thread.IsBackground = true;
                //启动线程     
                thread.Start(connection);
            }
        }

        /// <summary>
        /// 接收客户端发来的信息,客户端套接字对象
        /// </summary>
        /// <param name="socketclientpara"></param>    
        static void recv(object socketclientpara)
        {
            Socket socketServer = socketclientpara as Socket;

            while (true)
            {
                //创建一个内存缓冲区,其大小为1024*1024字节  即1M     
                byte[] arrServerRecMsg = new byte[1024 * 1024];
                //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度    
                try
                {
                    int length = socketServer.Receive(arrServerRecMsg);

                    //将机器接受到的字节数组转换为人可以读懂的字符串     
                    string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);

                    //将发送的字符串信息附加到文本框txtMsg上     
                    Console.WriteLine("客户端:" + socketServer.RemoteEndPoint + ",time:" + GetCurrentTime() + "\r\n" + strSRecMsg + "\r\n\n");

                    socketServer.Send(Encoding.UTF8.GetBytes("测试server 是否可以发送数据给client "));
                }
                catch (Exception ex)
                {
                    clientConnectionItems.Remove(socketServer.RemoteEndPoint.ToString());

                    Console.WriteLine("Client Count:" + clientConnectionItems.Count);

                    //提示套接字监听异常  
                    Console.WriteLine("客户端" + socketServer.RemoteEndPoint + "已经中断连接" + "\r\n" + ex.Message + "\r\n" + ex.StackTrace + "\r\n");
                    //关闭之前accept出来的和客户端进行通信的套接字 
                    socketServer.Close();
                    break;
                }
            }
        }

        ///      
        /// 获取当前系统时间的方法    
        /// 当前时间     
        static DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }
    }
}

  client端代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Diagnostics;

namespace SocketClient
{
    public partial class Main : Form
    {
        //创建 1个客户端套接字 和1个负责监听服务端请求的线程  
        Thread threadclient = null;
        Socket socketclient = null;

        public Main()
        {
            InitializeComponent();

            StartPosition = FormStartPosition.CenterScreen;
            //关闭对文本框的非法线程操作检查  
            TextBox.CheckForIllegalCrossThreadCalls = false;

            this.btnSendMessage.Enabled = false;
            this.btnSendMessage.Visible = false;

            this.txtMessage.Visible = false;
        }

        private void btnConnection_Click(object sender, EventArgs e)
        {
            this.btnConnection.Enabled = false;
            //定义一个套接字监听  
            socketclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //获取文本框中的IP地址  
            IPAddress address = IPAddress.Parse("127.0.0.1");

            //将获取的IP地址和端口号绑定在网络节点上  
            IPEndPoint point = new IPEndPoint(address, 8098);

            try
            {
                //客户端套接字连接到网络节点上,用的是Connect  
                socketclient.Connect(point);
                this.btnSendMessage.Enabled = true;
                this.btnSendMessage.Visible = true;
                this.txtMessage.Visible = true;
            }
            catch (Exception)
            {
                Debug.WriteLine("连接失败\r\n");

                this.txtDebugInfo.AppendText("连接失败\r\n");
                return;
            }

            threadclient = new Thread(recv);
            threadclient.IsBackground = true;
            threadclient.Start();
        }

        // 接收服务端发来信息的方法    
        void recv()
        {
            int x = 0;
            //持续监听服务端发来的消息 
            while (true)
            {
                try
                {
                    //定义一个1M的内存缓冲区,用于临时性存储接收到的消息  
                    byte[] arrRecvmsg = new byte[1024 * 1024];

                    //将客户端套接字接收到的数据存入内存缓冲区,并获取长度  
                    int length = socketclient.Receive(arrRecvmsg);

                    //将套接字获取到的字符数组转换为人可以看懂的字符串  
                    string strRevMsg = Encoding.UTF8.GetString(arrRecvmsg, 0, length);
                    if (x == 1)
                    {
                        this.txtDebugInfo.AppendText("服务器:" + GetCurrentTime() + "\r\n" + strRevMsg + "\r\n\n");
                        Debug.WriteLine("服务器:" + GetCurrentTime() + "\r\n" + strRevMsg + "\r\n\n");
                    }
                    else
                    {
                        this.txtDebugInfo.AppendText(strRevMsg + "\r\n\n");
                        Debug.WriteLine(strRevMsg + "\r\n\n");
                        x = 1;
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("远程服务器已经中断连接" + "\r\n\n");
                    Debug.WriteLine("远程服务器已经中断连接" + "\r\n");
                    break;
                }
            }
        }

        //获取当前系统时间  
        DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }

        //发送字符信息到服务端的方法  
        void ClientSendMsg(string sendMsg)
        {
            //将输入的内容字符串转换为机器可以识别的字节数组     
            byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg);
            //调用客户端套接字发送字节数组     
            socketclient.Send(arrClientSendMsg);
            //将发送的信息追加到聊天内容文本框中     
            Debug.WriteLine("hello...." + ": " + GetCurrentTime() + "\r\n" + sendMsg + "\r\n\n");
            this.txtDebugInfo.AppendText("hello...." + ": " + GetCurrentTime() + "\r\n" + sendMsg + "\r\n\n");
        }

        private void btnSendMessage_Click(object sender, EventArgs e)
        {
            //调用ClientSendMsg方法 将文本框中输入的信息发送给服务端     
            ClientSendMsg(this.txtMessage.Text.Trim());
            this.txtMessage.Clear();
        }
    }
}

 

ios – CMAltimeter回调永远不会触发

ios – CMAltimeter回调永远不会触发

使用我的6我一直在尝试使用CoreMotion的新CMAltimeter读取相对高度和压力.然而,回调永远不会解雇.我有一个非常相似的设置,而是使用加速度计,陀螺仪和磁力计.他们似乎都很好.

想知道是否有人设法获得阅读?

- (void)viewDidLoad {
    [super viewDidLoad];

    if([CMAltimeter isRelativeAltitudeAvailable]){
        CMAltimeter *altimeterManager = [[CMAltimeter alloc]init];
        [altimeterManager startRelativeAltitudeUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAltitudeData *altitudeData,NSError *error) {
            // This never fires.
            Nsstring *data = [Nsstring stringWithFormat:@"Altitude: %f %f",altitudeData.relativeAltitude.floatValue,altitudeData.pressure.floatValue];
            NSLog(@"%@",data);
            self.altimeterLabel.text = data;
        }];
        NSLog(@"Started altimeter");
        self.altimeterLabel.text = @"-\n-";
    } else {
        NSLog(@"Altimeter not available");
    }
}

我已经尝试过快速步行,但是这里只有一个高度失去/获得的故事.

解决方法

我非常尴尬地以如此巨大的疏忽来回答我自己的问题.

在原始帖子中,我在viewDidLoad的范围内声明了CMAltimiter,因此它超出了范围并被取消分配.我把它变成了iVar,现在回调了.

#import "ViewController.h"
@import CoreMotion;

@interface ViewController ()
@property (nonatomic,strong) CMAltimeter *altimeterManager;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    if([CMAltimeter isRelativeAltitudeAvailable]){
        self.altimeterManager = [[CMAltimeter alloc]init];
        [self.altimeterManager startRelativeAltitudeUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAltitudeData *altitudeData,NSError *error) {
            // This Now fires properly
            Nsstring *data = [Nsstring stringWithFormat:@"Altitude: %f %f",data);
            self.altimeterLabel.text = data;
        }];
        NSLog(@"Started altimeter");
        self.altimeterLabel.text = @"-\n-";
    } else {
        NSLog(@"Altimeter not available");
    }
}

今天关于socket.io:客户端发出的回调永远不会触发socket 回调的讲解已经结束,谢谢您的阅读,如果想了解更多关于aiohttp Websockets 服务器不向所有客户端发送消息、Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit不会触发、C#使用Socket实现一个socket服务器与多个socket客户端通信、ios – CMAltimeter回调永远不会触发的相关知识,请在本站搜索。

本文标签: