关于vibe.d的socket开发的例子微乎其微,我是看着API文档一点一点写的, 我这里抛砖引玉,方便后来者。

而d语言版本的thrift也和其它语言版本的有很大的不同,其中很明显的不同是,它生成的类并不继承于TBase,所以最开始我想写一个通用的序列化、反序列化函数的时候无从下手。但是我发现其中细节,就是生成的类不包含read write方法,但是可以调用,个中原因我还没搞明白,随着我对D的深入学习,以后再弄明白原因吧。但是这启发我尝试了一下泛型编程,如我所料的成了。

D的代码看起来真简洁:

module ezsockacount.Acceptor;

import vibe.d;
import ezsockacount.Dao;
import serviceheader_types;
import thrift.protocol.compact;
import thrift.protocol.base;
import thrift.transport.memory;
import thrift.transport.base;

class Acceptor
{
    void listen()
    {
        listenTCP(7009, (conn){ handleConn(conn); });
    }

private ubyte[] readPacket(TCPConnection conn)
    {
        ubyte lendata[4];
        conn.read(lendata);
        int len = std.bitmanip.littleEndianToNative!int(lendata);
        ubyte[] data = new ubyte[len];
        conn.read(data);
        return data;
    }

private T deserialObj(T)(ubyte[] data) 
    {
        T obj;
        TMemoryBuffer trans = new TMemoryBuffer(data);
        auto prot = new TCompactProtocol!TMemoryBuffer(trans);
        obj.read(prot);
        return obj;
    }

private void writePacket(TCPConnection conn,ubyte[] data)
    {
        ubyte lendata[] = std.bitmanip.nativeToLittleEndian(data.length);
        conn.write(lendata);
        conn.write(data);
    }

private ubyte[] serialObj(T) (ref T obj)
    {
        ubyte[] ret;
        TMemoryBuffer trans = new TMemoryBuffer(ret);
        auto prot = new TCompactProtocol!TMemoryBuffer(trans);
        obj.write(prot);
        return ret;
    }

void handleConn(TCPConnection conn)
    {
        ubyte[] data = readPacket(conn);
        Cmd cmd = deserialObj!(Cmd)(data);
        Cmd ret = handleCmd(cmd);
        ubyte[] retData = serialObj!(Cmd)(ret);
        writePacket(conn,data);
    }

private Cmd  handleCmd(ref Cmd req)
    {
        Cmd rsp;
        // your business logic
        return rsp;
    }
}

[dlang](二)用vibe.d+thrift做网络编程相关推荐

  1. (二)socket收发准备函数——网络编程

    (1)主机字节序与网络字节序 字节序是指内存多于一个字节类型的数据在内存中的存放顺序. 一种是将低序字节存储在起始地址,这种称为小端(little-endian)字节序. 一种是将高序字节存储在起始地 ...

  2. 网络编程基础 --> 网络通信机理、报文与协议、套接字通信预备

    此文我们来剖析你从网上获取的各种资源,是如何历经千辛万苦,跑到你的眼前的! 先来了解一下我们日常使用的大部分应用软件的最基本架构~ C/S 架构与B/S架构 C/S架构(client <-> ...

  3. Linux环境下网络编程杂谈

    今天我们说说"Pre-网络编程".内容比较杂,但都是在做网络应用程序开发过程中经常要遇到的问题. 一.大端.小端和网络字节序 小端字节序:little-endian,将低字节存放在 ...

  4. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  5. Java Web 实战 15 - 计算机网络之网络编程套接字

    文章目录 一 . 网络编程中的基本概念 1.1 网络编程 1.2 客户端(client) / 服务器(server) 1.3 请求(request) / 响应(response) 1.4 客户端和服务 ...

  6. Android网络编程(一)HTTP协议原理

    相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 And ...

  7. Java 知识点整理-20.网络编程

    目录 补充的一些快捷键 网络编程概述 网络编程三要素之IP概述 网络编程三要素之端口号概述 网络编程三要素之协议概述 Socket通信原理图解 UDP传输 UDP传输优化 UDP传输多线程 UDP聊天 ...

  8. python网络编程初级

    网络编程的专利权应该属于Unix,各个平台(如windows.Linux等).各门语言(C.C++.Python.Java等)所实现的符合自身特性的语法都大同小异.在我看来,懂得了Unix的socke ...

  9. 【javaEE】网络编程套接字

    To u&me: 努力经营当下,直至未来明朗 文章目录 前言 一.网络编程(没时间可以跳过) 一)网络编程了解 二)相关基本概念 二.Socket套接字 三.数据报套接字通信(UDP) 写一个 ...

  10. 【网络编程开发系列】好端端的MQTT-broker重新部署后居然出现TLS握手失败了

    摘要:本文通过一次真实的现网案例复盘,深度还原TLS握手问题的排查思路和方法,希望对广大读者有所启发和帮助. 文章目录 1 写在前面 2 问题描述 2.1 项目背景 2.2 现场问题 3 场景复现 3 ...

最新文章

  1. 6、android传递数据之剪切板传递数据
  2. selector是在文件夹drawable中进行定义的xml文件转载 https://www.cnblogs.com/fx2008/p/3157040.html...
  3. deep learning 作業 2.2
  4. oracle基础之工具系列(持续更新中,,)
  5. 新安江遗传算法c语言,基于遗传算法的新安江模型参数优化率定(四)
  6. 前端学习(2968):实现路由跳转的两种方式
  7. Chrome浏览器多开,亲测有效
  8. button点击后变色_汽车改色膜新潮流,2021年流行渐变色
  9. 换ip_换IP对云手机来说是好事吗?
  10. Java数组数字排列
  11. Debian11更换阿里源
  12. utf8编码在线转换html,utf8 gb2312编码在线转换工具
  13. phpnow php.ini,phpnow php探针环境检测代码
  14. 设计模式(博客园精化集)〈转〉
  15. iP网络广播系统服务器搭建,IP网络智能公共广播系统V2.0
  16. 医疗器械软件注册 - 基本概念
  17. spring boot 获取配置项值:@Value的使用
  18. PDF压缩的使用工具有哪些
  19. 2022口碑最好的无线蓝牙耳机推荐,适合学生党购买的蓝牙耳机品牌
  20. 【WSN】基于COMPOW协议下的网络连通率和覆盖率附matlab代码

热门文章

  1. 2004年1月六级听力原文的启示:每顿饭后刷牙牙齿好
  2. 干货 | 高盛:2017人工智能报告中文版(附PDF版下载)
  3. Win 7 Office 2007,打开word出错
  4. S5P4418裸机开发(三):运行裸机程序
  5. 使用容联云通讯实现短信验证登入
  6. PixelLink: Detecting Scene Text via Instance Segmentation算法详解
  7. mysql远程操作权限(navicat for mysql)
  8. 8.千峰教育os与窗口控制与内存修改与语言----自制随堂笔记
  9. js中的Image对象
  10. win10系统安装jdk8,并且配置环境变量教程