专栏首页用户1175783的专栏# Dart Socket之TCP粘包

# Dart Socket之TCP粘包

# Dart Socket之TCP粘包

# 什么是TCP粘包

socket编程-tcp粘包

# dart中的socket

  • RawDatagramSocket ​ 用于UDP通信

* RawServerSocket、RawSocket、ServerSocket、Socket

​	RawServerSocket,RawSocket:低级别的tcp服务提供类,可用于IP,ICMP协议		

​	ServerSocket、Socket:用于TCP通信
  • RawSecureServerSocket,RawSecureSocket、SecureServerSocket、SecureSocket ​ 支持SSL、TSL的安全通信

# dart之udp通信

udp是无状态通信,通常用于服务发现。
//Server端
var udpSocket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 34343);
//这里要启用广播,重要
udpSocket.broadcastEnabled = true;

await for (var event in udpSocket) {
    if (RawSocketEvent.read == event) {
        var data = udpSocket.receive();
        var result = Utf8Codec().decode(data.data);
        print(result);
    }
}

//Client端
//要创建一个udp实例,必须指定一个端口,即使仅为客户端,端口任意
var client = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 33333);
client.broadcastEnabled = true;
var helloBytes = utf8.encode("hello");
Future.doWhile(() async {
    await Future.delayed(Duration(seconds: 1));
    udpSocket.send(helloBytes, InternetAddress("255.255.255.255"), 34343);
    return true;
});

# dart之tcp通信

//Server端
main(List<String> args) async {
  var server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 33333);
  print("start server....");
  await for (var socket in server) {
    acceptSocket(socket);
  }
}

//接受Client连接
acceptSocket(Socket socket) async {
  await for (var data in socket) {
    print("server:$data");
    send(socket, data);
  }
}

send(Socket socket, data) async {
  sleep(Duration(seconds: 3));
  try {
    socket.add(data);
    await socket.flush();
  } catch (e) {
    print(e);
  }
}

//Client端
main(List<String> args) async {
  var client = await Socket.connect(InternetAddress.loopbackIPv4, 33333);
  var helloBytes = utf8.encode("hello");
  client.add(helloBytes);
  await client.flush();
  
  await for (var data in client) {
    print("clinet:$data");
    send(client, data);
  }
}

send(Socket socket, data) async {
  sleep(Duration(seconds: 3));
  try {
    socket.add(data);
    await socket.flush();
  } catch (e) {
    print(e);
  }
}

# dart之tcp粘包扩展

最近写了一个文件传输工具需要对tcp进行粘包处理,所以实现了几个tcp粘包处理类。

package: d_socket

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • # Event loop

    ​ dart是一种单线程语言,异步模型主要是通过事件轮询(event loop)来实现,另外也提供了更高级的Isolate来支持多线程,通常用于计算比较耗时的操...

    用户1175783
  • 从Win服务启动UI程序

    从windows服务启动一个带UI程序的界面,这个需求在xp中是很随意的,从Vista开始似乎没有那么随意了,因为Vista中加入了Session的概念,那么什...

    用户1175783
  • # Futter入门到精通

    文笔不行写不出高深的理论,只能借鉴引用高人的高论了,下面文章的一些连接来自一些国内/外高人的原创或者翻译文章。所谓站在巨人的肩上,就是的是把别人的知识变成自己的...

    用户1175783
  • Accelerate Framework in Swift

    最近看到这篇文章有对Accelerate框架有一个介绍,自己也按照作者给的思路整理了一遍,也算是对这一框架的一个重新的回顾和学习,在以前研究AR先关...

    Mr.RisingSun
  • VMware中如何安装虚拟机

    首先先提供一波该软件VMware的下载链接链接: https://pan.baidu.com/s/16YU7bQ9FNI_ovzf8AHx-Tg 提取码:6...

    萌萌哒的瓤瓤
  • python __slots__ 限制属性

    onety码生
  • JDBC(二)之JDBC处理CLOB和BLOB及事务与数据库元数据获取

    前面大概介绍了JDBC连接数据库的过程,以及怎么操作数据库,今天给大家分享JDBC怎么处理CLOB和BLOB存储图片的事情,以及JDBC怎么去处理事务。怎么在插...

    用户1195962
  • 基于STM32的串口循环队列

    先说串口,这个应该都知道吧!(不知道的童鞋,先把基本功学好)大部分单片机或者处理器都会带一个或者多个串口,方便进行数据的通信。

    MCU起航
  • 给单元素艺术添加动画

    原文:Animating Single Div Art 翻译:nzbin 导读:学习工具的最好的方法就是尝试新技术,本文通过“单元素艺术”介绍了 CSS 变量的...

    叙帝利
  • 【云开发校园技术布道师】大学生记账本

    记账最直接的作用就是摸清收入、支出的具体情况,看看自己到底挣了多少钱,花了多少钱,钱都花在什么地方。还可以知道维持正常的日常生活需要多少钱,剩下的钱可以考虑进行...

    常延威

扫码关注云+社区

领取腾讯云代金券