看标准 越看越糊,根本原因: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)的更多相关文章

  1. dicom网络通讯入门(2)

    第二篇,前面都是闲扯 其实正文现在才开始,这次是把压箱底的东西都拿出来了. 首先我们今天要干的事是实现一个echo响应测试工具 也就是echo 的scu,不是实现打印作业管理么.同学我告诉你还早着呢. ...

  2. dicom网络通讯入门(3)

    接下来可以进行消息传递了 ,也就是dimse ,再来复习下 什么是dimse .n-set  n-create c-echo 这些都是dimse  他们都是属于一种结构的pdu 那就是tf-pdu(传 ...

  3. Python网络爬虫入门篇

    1.  预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. 2. Python爬虫基本流程 a. 发送请求 使用 ...

  4. 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

    本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...

  5. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言   老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...

  6. 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...

  7. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  8. 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机 ...

  9. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

随机推荐

  1. MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)

    在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...

  2. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  3. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  4. 深入理解 JavaScript,以及 Linux 下的开发调试工具

    前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...

  5. 第14章 Linux启动管理(3)_系统修复模式

    3. 系统修复模式 3.1 单用户模式 (1)在grub界面中选择第2项,并按"e键"进入编辑.并在"-quiet"后面加入" 1",即&q ...

  6. MySQL对时间戳的转换处理

    开发中很多时候在数据库里都会存储Long类型的时间戳,而时间戳做比对会相对麻烦 我的绝决方案: SELECT FROM_UNIXTIME(LEFT(create_time,10), '%Y-%m-%d ...

  7. Error connecting to database [Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)]

    参照 http://stackoverflow.com/questions/4448467/cant-connect-to-local-mysql-server-through-socket-var- ...

  8. [Java面经] 关于面试的二三事.

    今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...

  9. javascript继承的三种模式

    javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...

  10. Qt5 开发 iOS 应用之访问 SQLite 数据库

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1   源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...