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协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
随机推荐
- .net 分布式架构之配置中心
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...
- Smarty的基本使用与总结
含义: Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来. 环境需求:PHP5.2或者更高版本 我使用的环境是:PHP5.3,wi ...
- geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)
目录 前言 实现过程 总结 一.前言 上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...
- RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密
最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...
- Linux网络驱动--snull
snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...
- python_单元测试unittest
Python自带一个单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 步骤1:首先引入unittest模块--import un ...
- OAuth2 理解
OAth2 是为了某个应用向第三方应用开放服务时,控制权限的. 因为不可以直接将账户体系开放出去,要求重新登录. 其实本质是让用户在客户端来判断是否要给该应用开放平台的权限,如果用户同意,那么可以拿到 ...
- 快速Android开发系列网络篇之Android-Async-Http
先来看一下最基本的用法 AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com&q ...
- 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView
背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5中创建GridView>中,我们学习了如何在 ASP.NET MVC 中实现 GridView,类似于 ASP.NET web ...
- svn diff 详解
UI版: 如果多人编辑同一段代码,常常容易出现冲突的情况: 如果出现冲突,我们如何解决他呢? 1 可以选择使用自己的文件mime file,也可以使用 他们的文件 their file 2 解决冲突, ...