dicom网络通讯入门(1)

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

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

简图:

dicom网络通讯入门(1)

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

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

好然后我们立马来设计一个程序,立马  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响应测试成功:
dicom网络通讯入门(1)

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

dicom网络通讯入门(1)

上一篇:Python面试题都在这里了


下一篇:ubuntu为什么没有/etc/inittab文件? 深究ubuntu的启动流程分析