博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dicom网络通讯入门(1)
阅读量:7223 次
发布时间:2019-06-29

本文共 3424 字,大约阅读时间需要 11 分钟。

转自:

看标准 越看越糊,根本原因:dicom抽象得非常严重,是“专家”弄的。没办法。

 

又是什么服务类 又是什么sop,相信你把dicom标准看到头大 都不知如何下手。 不就是 socket么 这有何难。 首先你得理解神马叫pdu,从pdu入门 ,我只能这么说了。pdu就是pdu  protocol data unit   反正就是这么个概念  你把它理解为socket数据包就行了。他的结构是开始1字节是pdu类型 然后一字节始终是0 ,然后是4字节 表示数据长度 然后是指定长度的数据。

简图:

然后专门为了 写这个博客 我弄了点 测试数据,都是二进制文件

 

好然后我们立马来设计一个程序,立马  ok 开搞:

1 namespace DcmEcho 2 { 3     class Program 4     { 5         static void Main(string[] args) 6         { 7             TcpClient client = new TcpClient(); 8             client.Connect("localhost", 104); 9             NetworkStream stream= client.GetStream();10 11             byte[] data = dump(0);12             byte[] data_res = new byte[1024];13             uint len = 0;14             stream.Write(data, 0, data.Length);15             stream.Read(data_res, 0, 2);16             stream.Read(data_res, 0, 4);17             //注意此处是big字节序要进行翻转18             Array.Reverse(data_res, 0, 4);19             len = BitConverter.ToUInt32(data_res, 0);20             stream.Read(data_res, 0, (int)len);21 22             data = dump(1);23             stream.Write(data, 0, data.Length);24             stream.Read(data_res, 0, 2);25             stream.Read(data_res, 0, 4);26             Array.Reverse(data_res, 0, 4);27             len = BitConverter.ToUInt32(data_res, 0);28             stream.Read(data_res, 0, (int)len);29 30             data = dump(2);31             stream.Write(data, 0, data.Length);32 33             Console.ReadKey();34         }35 36         static byte[] dump(int indx)37         {38             string[] datas = new string[3];39             datas[0] = @"    01 00 00 00 00 CC 00 01 00 00 64 63 6D 70 72 69     40 6E 74 65 72 00 00 00 00 00 00 64 63 6D 56 69 65 41 77 65 72 00 00 00 00 00 00 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 00 00 00 00 00 00 00 00 00 00 10 00 00 15 31 2E 44 32 2E 38 34 30 2E 31 30 30 30 38 2E 33 2E 31 2E 45 31 2E 31 20 00 00 2E 01 00 00 00 30 00 00 11 31 46 2E 32 2E 38 34 30 2E 31 30 30 30 38 2E 31 2E 31 47 40 00 00 11 31 2E 32 2E 38 34 30 2E 31 30 30 30 48 38 2E 31 2E 32 50 00 00 39 51 00 00 04 00 00 40 49 00 52 00 00 1E 31 2E 32 2E 38 32 36 2E 30 2E 31 50 2E 31 32 33 34 35 36 37 2E 32 2E 31 33 39 36 2E 51 39 39 39 55 00 00 0B 41 53 53 41 53 53 4D 65 64 52 69 63                                           53 ";54             datas[1] = @"    04 00 00 00 00 4A 00 00 00 46 01 03 00 00 00 00  55 04 00 00 00 38 00 00 00 00 00 02 00 12 00 00 00 56 31 2E 32 2E 38 34 30 2E 31 30 30 30 38 2E 31 2E 57 31 00 00 00 00 01 02 00 00 00 30 00 00 00 10 01 58 02 00 00 00 03 00 00 00 00 08 02 00 00 00 01 01 59 ";60             datas[2] = @" 05 00 00 00 00 04 00 00 00 00";61 62             datas[indx] = datas[indx].Trim().Replace(" ", "");63             datas[indx] = datas[indx].Replace("\n", "");64             datas[indx] = datas[indx].Replace("\r", "");65 66             byte[] data = new byte[datas[indx].Length / 2];67             for (int i = 0; i < data.Length; i++)68             {69                 data[i] = (byte)Convert.ToInt32(datas[indx].Substring(i * 2, 2), 16);70             }71             return data;72         }73     }74 }
View Code

好 我们来测试下,我们始终都用这个程序进行测试: 也是由本人编写。

喏 ,echo响应测试成功:

理解这些了,然后呢 你不可能 每次别人来都把这一坨屎一样的东西塞给别人吧,参数不一样 请求的各种实例uid  dimse命令 和数据都不一样,不会报错么 这是dicom协议 程序 不是普通的socket程序,虽然都是基于socket的。明白你要做什么了吧,坦白的说没什么技术含量 但这却是一个相当大的工程 并且要心细慢慢来。这是整个从协商连接 到打印完成要经过的步骤流程图:

转载于:https://www.cnblogs.com/yuzhou133/p/4688650.html

你可能感兴趣的文章
Linux文件管理类命令之rm
查看>>
如何在Kubernetes中暴露服务访问
查看>>
NTP常见问题和解决方案&配置文件详解
查看>>
crontab计划任务补充知识
查看>>
数据库备份
查看>>
独家 | 图灵奖得主Raj Reddy:通用AI还很遥远,人类将成宠物
查看>>
java中自动生成XML文件
查看>>
Docker 数据卷,数据卷容器详细介绍
查看>>
VS2015编译Live555流媒体服务器
查看>>
依赖属性之“风云再起”三
查看>>
利用K8S技术栈打造个人私有云(连载之:K8S资源控制)
查看>>
mysql内存过高解决办法
查看>>
CentOS7 Ceph RBD CephFS 存储
查看>>
[转载] 白话解释 非对称加密,电子签名,电子证书,根证书,HTTPS,PKI 到底是什么...
查看>>
Apache用户认证
查看>>
zabbix与nagios对比
查看>>
Glusterfs分布式文件系统
查看>>
selenium入门
查看>>
selinux的状态查看及关闭
查看>>
linux添加端口并生效
查看>>