[dlang](二)用vibe.d+thrift做网络编程
关于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做网络编程相关推荐
- (二)socket收发准备函数——网络编程
(1)主机字节序与网络字节序 字节序是指内存多于一个字节类型的数据在内存中的存放顺序. 一种是将低序字节存储在起始地址,这种称为小端(little-endian)字节序. 一种是将高序字节存储在起始地 ...
- 网络编程基础 --> 网络通信机理、报文与协议、套接字通信预备
此文我们来剖析你从网上获取的各种资源,是如何历经千辛万苦,跑到你的眼前的! 先来了解一下我们日常使用的大部分应用软件的最基本架构~ C/S 架构与B/S架构 C/S架构(client <-> ...
- Linux环境下网络编程杂谈
今天我们说说"Pre-网络编程".内容比较杂,但都是在做网络应用程序开发过程中经常要遇到的问题. 一.大端.小端和网络字节序 小端字节序:little-endian,将低字节存放在 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- Java Web 实战 15 - 计算机网络之网络编程套接字
文章目录 一 . 网络编程中的基本概念 1.1 网络编程 1.2 客户端(client) / 服务器(server) 1.3 请求(request) / 响应(response) 1.4 客户端和服务 ...
- Android网络编程(一)HTTP协议原理
相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 And ...
- Java 知识点整理-20.网络编程
目录 补充的一些快捷键 网络编程概述 网络编程三要素之IP概述 网络编程三要素之端口号概述 网络编程三要素之协议概述 Socket通信原理图解 UDP传输 UDP传输优化 UDP传输多线程 UDP聊天 ...
- python网络编程初级
网络编程的专利权应该属于Unix,各个平台(如windows.Linux等).各门语言(C.C++.Python.Java等)所实现的符合自身特性的语法都大同小异.在我看来,懂得了Unix的socke ...
- 【javaEE】网络编程套接字
To u&me: 努力经营当下,直至未来明朗 文章目录 前言 一.网络编程(没时间可以跳过) 一)网络编程了解 二)相关基本概念 二.Socket套接字 三.数据报套接字通信(UDP) 写一个 ...
- 【网络编程开发系列】好端端的MQTT-broker重新部署后居然出现TLS握手失败了
摘要:本文通过一次真实的现网案例复盘,深度还原TLS握手问题的排查思路和方法,希望对广大读者有所启发和帮助. 文章目录 1 写在前面 2 问题描述 2.1 项目背景 2.2 现场问题 3 场景复现 3 ...
最新文章
- 6、android传递数据之剪切板传递数据
- selector是在文件夹drawable中进行定义的xml文件转载 https://www.cnblogs.com/fx2008/p/3157040.html...
- deep learning 作業 2.2
- oracle基础之工具系列(持续更新中,,)
- 新安江遗传算法c语言,基于遗传算法的新安江模型参数优化率定(四)
- 前端学习(2968):实现路由跳转的两种方式
- Chrome浏览器多开,亲测有效
- button点击后变色_汽车改色膜新潮流,2021年流行渐变色
- 换ip_换IP对云手机来说是好事吗?
- Java数组数字排列
- Debian11更换阿里源
- utf8编码在线转换html,utf8 gb2312编码在线转换工具
- phpnow php.ini,phpnow php探针环境检测代码
- 设计模式(博客园精化集)〈转〉
- iP网络广播系统服务器搭建,IP网络智能公共广播系统V2.0
- 医疗器械软件注册 - 基本概念
- spring boot 获取配置项值:@Value的使用
- PDF压缩的使用工具有哪些
- 2022口碑最好的无线蓝牙耳机推荐,适合学生党购买的蓝牙耳机品牌
- 【WSN】基于COMPOW协议下的网络连通率和覆盖率附matlab代码
热门文章
- 2004年1月六级听力原文的启示:每顿饭后刷牙牙齿好
- 干货 | 高盛:2017人工智能报告中文版(附PDF版下载)
- Win 7 Office 2007,打开word出错
- S5P4418裸机开发(三):运行裸机程序
- 使用容联云通讯实现短信验证登入
- PixelLink: Detecting Scene Text via Instance Segmentation算法详解
- mysql远程操作权限(navicat for mysql)
- 8.千峰教育os与窗口控制与内存修改与语言----自制随堂笔记
- js中的Image对象
- win10系统安装jdk8,并且配置环境变量教程