dicom网络通讯入门(1)
看标准 越看越糊,根本原因:dicom抽象得非常严重,是“专家”弄的。没办法。
又是什么服务类 又是什么sop,相信你把dicom标准看到头大 都不知如何下手。 不就是 socket么 这有何难。 首先你得理解神马叫pdu,从pdu入门 ,我只能这么说了。pdu就是pdu protocol data unit 反正就是这么个概念 你把它理解为socket数据包就行了。他的结构是开始1字节是pdu类型 然后一字节始终是0 ,然后是4字节 表示数据长度 然后是指定长度的数据。
简图:
然后专门为了 写这个博客 我弄了点 测试数据,都是二进制文件
好然后我们立马来设计一个程序,立马 ok 开搞:
namespace DcmEcho
{
class Program
{
static void Main(string[] args)
{
TcpClient client = new TcpClient();
client.Connect("localhost", );
NetworkStream stream= client.GetStream(); byte[] data = dump();
byte[] data_res = new byte[];
uint len = ;
stream.Write(data, , data.Length);
stream.Read(data_res, , );
stream.Read(data_res, , );
//注意此处是big字节序要进行翻转
Array.Reverse(data_res, , );
len = BitConverter.ToUInt32(data_res, );
stream.Read(data_res, , (int)len); data = dump();
stream.Write(data, , data.Length);
stream.Read(data_res, , );
stream.Read(data_res, , );
Array.Reverse(data_res, , );
len = BitConverter.ToUInt32(data_res, );
stream.Read(data_res, , (int)len); data = dump();
stream.Write(data, , data.Length); Console.ReadKey();
} static byte[] dump(int indx)
{
string[] datas = new string[];
datas[] = @" 01 00 00 00 00 CC 00 01 00 00 64 63 6D 70 72 69
6E 74 65 72 00 00 00 00 00 00 64 63 6D 56 69 65
77 65 72 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 10 00 00 15 31 2E
32 2E 38 34 30 2E 31 30 30 30 38 2E 33 2E 31 2E
31 2E 31 20 00 00 2E 01 00 00 00 30 00 00 11 31
2E 32 2E 38 34 30 2E 31 30 30 30 38 2E 31 2E 31
40 00 00 11 31 2E 32 2E 38 34 30 2E 31 30 30 30
38 2E 31 2E 32 50 00 00 39 51 00 00 04 00 00 40
00 52 00 00 1E 31 2E 32 2E 38 32 36 2E 30 2E 31
2E 31 32 33 34 35 36 37 2E 32 2E 31 33 39 36 2E
39 39 39 55 00 00 0B 41 53 53 41 53 53 4D 65 64
69 63
";
datas[] = @" 04 00 00 00 00 4A 00 00 00 46 01 03 00 00 00 00
04 00 00 00 38 00 00 00 00 00 02 00 12 00 00 00
31 2E 32 2E 38 34 30 2E 31 30 30 30 38 2E 31 2E
31 00 00 00 00 01 02 00 00 00 30 00 00 00 10 01
02 00 00 00 03 00 00 00 00 08 02 00 00 00 01 01
";
datas[] = @" 05 00 00 00 00 04 00 00 00 00"; datas[indx] = datas[indx].Trim().Replace(" ", "");
datas[indx] = datas[indx].Replace("\n", "");
datas[indx] = datas[indx].Replace("\r", ""); byte[] data = new byte[datas[indx].Length / ];
for (int i = ; i < data.Length; i++)
{
data[i] = (byte)Convert.ToInt32(datas[indx].Substring(i * , ), );
}
return data;
}
}
}
好 我们来测试下,我们始终都用这个程序进行测试:http://www.mrxstudio.com/ 也是由本人编写。
喏 ,echo响应测试成功:
理解这些了,然后呢 你不可能 每次别人来都把这一坨屎一样的东西塞给别人吧,参数不一样 请求的各种实例uid dimse命令 和数据都不一样,不会报错么 这是dicom协议 程序 不是普通的socket程序,虽然都是基于socket的。明白你要做什么了吧,坦白的说没什么技术含量 但这却是一个相当大的工程 并且要心细慢慢来。这是整个从协商连接 到打印完成要经过的步骤流程图:
dicom网络通讯入门(1)的更多相关文章
- dicom网络通讯入门(2)
第二篇,前面都是闲扯 其实正文现在才开始,这次是把压箱底的东西都拿出来了. 首先我们今天要干的事是实现一个echo响应测试工具 也就是echo 的scu,不是实现打印作业管理么.同学我告诉你还早着呢. ...
- dicom网络通讯入门(3)
接下来可以进行消息传递了 ,也就是dimse ,再来复习下 什么是dimse .n-set n-create c-echo 这些都是dimse 他们都是属于一种结构的pdu 那就是tf-pdu(传 ...
- Python网络爬虫入门篇
1. 预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. 2. Python爬虫基本流程 a. 发送请求 使用 ...
- 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?
本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...
- 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?
本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言 老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...
- 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)
本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
- 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?
1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
随机推荐
- Entity Framework的启动速度优化
最近开发的服务放到IIS上寄宿之后,遇到一些现象,比如刚部署之后,第一次启动很慢:程序放置一会儿,再次请求也会比较慢.比如第一个问题,可以解释为初次请求某一个服务的时候,需要把程序集加载到内存中可能比 ...
- [转载]网站地址栏小图标favicon.ico的制作方法
有人也许会好奇,有的网址前面有个漂亮的小图标而且有的网站图标还会动,这是怎么做到的呢? 如下图所示: 那个小图标有个名字叫favicon.ico,网站图标虽小但可以起到很好的点缀作用,尤其是当浏览者将 ...
- 【干货分享】流程DEMO-请休假
流程名: 请假申请 流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebService.cs 流程说明: 流程中集成了webservice服 ...
- 【MySql】查询数据库中所有表及列的信息
SELECT TABLE_NAME, -- 表名 COLUMN_NAME, -- 字段名 DATA_TYPE, -- 字段类型 COLUMN_COMMENT -- 字段注释 FROM INFORMAT ...
- Linux初识
在这篇文章中你讲看到如下内容: 计算机的组成及功能: Linux发行版之间的区别和联系: Linux发行版的基础目录及功用规定: Linux系统设计的哲学思想: Linux系统上获取命令帮助,及man ...
- Xamarin.Android广播接收器与绑定服务
一.前言 学习了前面的活动与服务后,你会发现服务对于活动而言似乎就是透明的,相反活动对于服务也是透明的,所以我们还需要一中机制能够将服务和活动之间架起一座桥梁,通过本节的学习,你将会学到广播与绑定服务 ...
- Windows 7 上安装Visual Studio 2015 失败解决方案
安装之前先要看看自己的系统支不支持,具体的可以看:https://www.visualstudio.com/en-us/visual-studio-2015-system-requirements-v ...
- Threadlocal使用Case
Threadlocal能够为每个线程分配一份单独的副本,使的线程与线程之间能够独立的访问各自副本.Threadlocal 内部维护一个Map,key为线程的名字,value为对应操作的副本. /** ...
- 探索 Linux 系统的启动过程
引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...
- Visual Studio 2015 移动跨平台开发初体验
微软换了新 CEO 后变化很大,对我们团队最有利的消息就是 Visual Studio 2015 支持移动应用跨平台开发. 还记不记得很早之前,Xamarin 宣布与微软成为合作伙伴的消息.显然,Xa ...