本文将为您提供关于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 回调)
- aiohttp Websockets 服务器不向所有客户端发送消息
- Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit不会触发
- C#使用Socket实现一个socket服务器与多个socket客户端通信
- ios – CMAltimeter回调永远不会触发
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 服务器不向所有客户端发送消息?
我正在尝试创建一个 Websockets aiohtttp
服务器,该服务器不断侦听消息(来自 Kafka 主题)并将收到的消息发送到所有连接的 websocket 客户端。
但是,当我使用 wscat
$ 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不会触发
我一直在这个问题上花费数小时,但无济于事。
编辑: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客户端通信
笔记一下知识内容,原文地址: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回调永远不会触发
想知道是否有人设法获得阅读?
- (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回调永远不会触发的相关知识,请在本站搜索。
本文标签: