专栏首页Flutter&DartDartVM服务器开发(第七天)--WebSocket

DartVM服务器开发(第七天)--WebSocket

上一篇文章中我们讲解了如何使用注解去处理请求,感觉是不是很方便呢?现在我们的服务器已经支持了返回html页面,处理移动端发来的请求!今天我们学习一下如何添加一个WebSocket到你的服务器,通过该编文章的学习,你将学会如何搭建一个简单的聊天室,有些小伙伴已经等不及了,那我们开始今天的学习吧!

1.建立迷你服务器

在我们写代码之前,我们先了解一下dart能干嘛? 下面我打开百度,输入dart,然后点击回车键

百度一下.png

可以看到我们熟悉的dart介绍,它被用于web、服务器、移动开发和物联网等领域的开发,等等,这里有一个目前比较热门的一个名词,物联网、对的,dart支持物联网,所以websocket使用非常的简单!

好了我们开始建立一个迷你服务器吧,这个建立迷你服务器,肯定是基于我们之前学习的服务器之上的,我这里会以请求路径为/mini去建立

staticFiles.errorPageHandler = (request) {
    if (request.uri.pathSegments.last.endsWith('.html')) {
      staticFiles.serveFile(new File(webPath + '/404.html'), request);
    } 
//new
else if (request.uri.path == '/mini') {
//当请求路径为/mini,判断为进行webScoket连接
     WebSocketManager.manager.serveRequest(request).catchError((error){
          LogUt.log.warning('webSocket异常',error,error.stackTrace);
        });
//new
    } else {
      try {
        ControllerManager.manager.requestServer(request);
      } catch (e) {
        try {
          request.response
            ..statusCode = HttpStatus.internalServerError
            ..close();
        } catch (_) {}
        LogUt.log.warning('请求消息发生异常', e,
            e.runtimeType == ArgumentError ? e.stackTrace : null);
      }
    }
  };

然后我们写一下WebSocketManager这个类,将传递的request请求升级为WebSocket请求

import 'dart:io';


class WebSocketManager{
  static WebSocketManager manager=new WebSocketManager();
  List<WebSocket> webSockets;

  WebSocketManager(){
    webSockets=[];
  }
Future serveRequest(HttpRequest request){
//判断当前请求是否可以升级为WebSocket
    if(WebSocketTransformer.isUpgradeRequest(request)){
//升级为webSocket
      return WebSocketTransformer
          .upgrade(request)
          .then((webSocket){
//添加到ist里面方便维护
        webSockets.add(socket);
//webSocket消息监听
        webSocket.listen(handMsg);
      });
    }else{
      request.response..statusCode=HttpStatus.notAcceptable
      ..writeln('该请求应为WebSocket连接')
      ..close();
      return new Future((){});
    }
  }

  //处理消息
  void handMsg(dynamic msg){
    print('收到客户端消息:$msg');

//给所有客户端回复当前客户端说了什么
   for(WebSocket webSocket in webSockets){
//判断是否有关闭代码,如果没有证明客户端当前未关闭,给它回复
        if(webSocket.closeCode==null){
//回复客户端一条消息
          webSocket.add('服务器回复: XX:$msg');
        }
    }
  }
}

上面将请求升级为WebSocket请求,然后监听收到的消息,当收到消息时,返回所有客户端当前客户端说了什么,这个就是一个简单的聊天室了,是不是很简单,那么,服务端有了,我们来弄一个客户端吧!当请求地址为/mini/client时开启一个客户端

//....
    else if(request.uri.path=='/mini/client'){
      SocketClient();
    } 
//.....

void SocketClient() async{
//客户端连接到服务端
  WebSocket client=await WebSocket.connect('ws://localhost:8080/mini');
//客户端接收消息
  client.listen((msg){
      print('客户端收到消息!');
      print(msg);
    });
//客户端发送消息
  client.add('Hello World!');
}

这里可以看到,连接的地址不再是以http开头,而是 ws://地址 的形式 下面我们来请求一下吧!http://localhost:8080/mini/client

回复.png

可以看到,我们成功的使用了webSocket进行通信

ok,今天的学习就到这里了,我们明天见!

如果想继续学习DartVM服务器开发,请关注我,学习更多骚操作!

  • 下一篇:DartVM服务器开发(第八天)--http服务端框架

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flutter之WidgetsApp使用详解&与MaterialApp的纠缠

    如果对MaterialApp不熟悉,可先看我上一篇文章: Flutter之MaterialApp使用详解

    rhyme_lph
  • Flutter正则大全

    rhyme_lph
  • Dart-Aqueduct框架开发(六)

    可以从名字看出,这个控制器是用来管理资源的,也就是上一节中介绍了控制器B,也可以称为端点的控制器,可以用以下图来描述:

    rhyme_lph
  • 速读原著-TCP/IP(sock程序)

    在本书中一直使用一个称为 s o c k的小测试程序,用来生成 T C P和U D P数据。它既可以用作一个客户进程,也可以用作一个服务器进程。有这样一个可以从...

    cwl_java
  • 使用 HTML5 WebSocket 构建实时 Web 应用

    作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 T...

    前朝楚水
  • Serverless实践系列(二):为Python云函数打包依赖

    在使用无服务器云函数SCF时通常会遇到导入第三方库的问题,很多小伙伴比较头疼是:应该如何打包进去?这里,推荐几个不错的方法。

    腾讯云serverless团队
  • TCP/UDP/SOCKET in Python

    计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为I/O(input output).

    mojocn
  • httperf 一个高性能的压力测试工具

    Written by bixuan on 2008年06月26号 – 22:14

    一见
  • 我们谈论的Exactly once到底是什么?

    最近在看Apache pulsar这个被誉为下一代消息队列的相关的,我之前其实已经写过很多kafka,rocketmq相关的文章,本来以为消息队列的技术大体花样...

    用户5397975
  • 机器人学习最前沿:一眼模仿学习(One-Shot Imitation Learning)的三级跳

    用户1908973

扫码关注云+社区

领取腾讯云代金券