Websocket 使用web套接字[多套接字]从服务器向DART lang中的客户端发送批量/推送消息

Websocket 使用web套接字[多套接字]从服务器向DART lang中的客户端发送批量/推送消息,websocket,dart,Websocket,Dart,在我的应用程序中,我将客户端的页脚专用于接收来自管理员的消息/通知,我曾想过使用web套接字[多套接字],但消息只发送回一个套接字,即消息发送回发送它的同一套接字,而不发送到其他套接字,希望随附的文件以一种简单的方式呈现问题 注意:所有套接字都响应socket onOpen和onClose,错误出现在onMessage的响应中 我的代码是: server.dart: 导入'dart:io'; 导入“包:intl/intl.dart”;//日期格式 类myClient{ WebSocket _插

在我的应用程序中,我将客户端的页脚专用于接收来自管理员的消息/通知,我曾想过使用web套接字[多套接字],但消息只发送回一个套接字,即消息发送回发送它的同一套接字,而不发送到其他套接字,希望随附的文件以一种简单的方式呈现问题

注意:所有套接字都响应socket onOpen和onClose,错误出现在onMessage的响应中

我的代码是:

server.dart:

导入'dart:io';
导入“包:intl/intl.dart”;//日期格式
类myClient{
WebSocket _插座;
myClient(WebSocket ws){
_socket=ws;
_socket.listen(messageHandler,
onError:errorHandler,
onDone:finishedHandler);
}
无效写入(字符串消息){u socket.add(消息);}
void messageHandler(字符串消息){
打印(“客户发送此消息$msg”);
分销信息(msg);
}
无效错误处理程序(错误){
打印('one socket get error:$error');
移除客户(本);
_socket.close();
}
void finishedHandler(){
打印(“一个插座已关闭”);
distributeMessage(“一个套接字已关闭”);
移除客户(本);
_socket.close();
}
}
列表客户端=新列表();
void main(){
绑定(InternetAddress.ANY_IP_V4,8080)。然后((HttpServer服务器){
打印(“HttpServer侦听…”);
侦听((HttpRequest请求){
if(WebSocketTransformer.isUpgradeRequest(请求)){
升级(请求)。然后(handleWebSocket);
}
否则{
打印(${request.uri.path}的常规${request.method}请求);
服务器请求;
}
});
});
}
空心把手承口(承口承口){
打印('客户端已连接!');
myClient客户端=新的myClient(套接字);
addClient(客户);
}
void serverrequest(HttpRequest请求){
request.response.statusCode=HttpStatus.probled;
request.response.reasonPhrase=“仅限WebSocket连接”;
request.response.close();
}
无效分发消息(字符串消息){
var now=new DateTime.now();
var timeStamp=新的日期格式(“[dd MMM@h:mma]”);
String formatTime=timeStamp.format(现在);
对于(客户端中的myClient c)c.write(“${timeStamp.format(now)}:$msg”);
}
void addClient(myClient c){
添加(c);
}
作废removeClient(myClient c){
客户。删除(c);
}
client.dart文件是:

导入'dart:html';
void main(){
元素fonixFooter=查询选择器(“#fonix footer”);
字符串服务器='ws://localhost:8080/';
WebSocket ws=新的WebSocket(服务器);
ws.onOpen.listen((事件e)=>fonixFooter.text='Connected to server');//这很好
listen((MessageEvent e){fonixFooter.text='与服务器的连接丢失…');//这很好
}
admin.dart是:

导入'dart:html';
void main(){
TextInputElement输入=查询选择器(“#输入”);
段落元素输出=查询选择器(“#输出”);
字符串服务器='ws://localhost:8080/';
WebSocket ws=新的WebSocket(服务器);
ws.onOpen.listen((事件e){
outputMessage(输出“连接到服务器”);
});
listen((MessageEvent e){
outputMessage(输出,例如数据);
}); 
侦听((事件e){
outputMessage(输出“与服务器的连接丢失…”);
});
input.onChange.listen((事件e){
send(input.value.trim());
input.value=“”;
});
}
无效输出消息(元素e,字符串消息){
打印(信息);
e、 附加文本(消息);
e、 附录HTML(“
”); e、 scrollTop=e.scrollHeight; }
根据@luizmineo的反馈,他测试了服务器端,我注意到我的代码正在工作,当且仅当每个套接字发送一些数据时,这个套接字没有发送数据,没有接收任何内容,但仍然不理解为什么!以及如何修复它


任何想法,我犯错误的地方!!任何关于更好方法的建议都将受到赞赏。

我通过要求每个套接字在连接时向服务器发送内容来解决问题,因此我有以下代码:

在main.dart和client.dart中,将onOpen更改为:

ws.onOpen.listen((Event e) => ws.send('Connected to server'));
在服务器中,dart将消息处理程序更改为:

  void messageHandler(String msg){  
    if (msg == 'Connected to server')write('Connected to server');   // send msg to the new socket only
    else distributeMessage(msg);  // send msg to all opened sockets
  }

我相信这是一个变通解决方案,希望听到直接的答案!

我已经测试了您的服务器实现,它似乎运行良好(不过,您也可以查看更高级别的websocket API,如redstone_web_socket和shelf_web_socket)。我还注意到,你的client.dart脚本使用fonixFooter.innerHtml属性显示收到的消息,fonixFooter.text显示连接状态。这可能是问题的原因。感谢@luizmineo,我使用了fonixFooter.text来处理所有问题,仍然存在相同的问题,而且我打开了另一个管理套接字,它没有与f交换MSGirst admin socket,除非它向服务器发送数据,否则我向客户端添加了一个输入字段以向服务器发送消息,消息在所有套接字中都被接收到,简单地说,我注意到我的代码在并且仅当每个套接字发送一些数据时才起作用,这个套接字没有发送数据,没有接收任何内容,但仍然不理解为什么w去修理它!