• dicom网络通讯入门(1)


    转自:http://www.cnblogs.com/assassinx/p/3649103.html

    看标准 越看越糊,根本原因: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("
    ", "");
    64             datas[indx] = datas[indx].Replace("
    ", "");
    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

    好 我们来测试下,我们始终都用这个程序进行测试:http://www.mrxstudio.com/ 也是由本人编写。
    喏 ,echo响应测试成功:

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

    人生,总是有一些空城旧事,年华未央;总是有些季节,一季花凉,满地忧伤。许多事,看开了,便会峰回路转;许多梦,看淡了,便会云开日出。学会思索,学会珍藏,微笑领悟,默默坚强。
  • 相关阅读:
    笔记(二) C#sql语句
    [叩响C#之门]写给初学者:多线程系列(七)——互锁(Interlocked类)
    C# Async与Await的使用
    C#线程锁使用全功略
    一个C#的加锁解锁示例
    【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
    Control.BeginInvoke()和delegate的BeginInvoke()的区别
    crm04 action操作 和 多级过滤
    VIM和sed 替换字符串方法
    解决Centos关闭You have new mail in /var/spool/mail/root提示(转)
  • 原文地址:https://www.cnblogs.com/yuzhou133/p/4688650.html
Copyright © 2020-2023  润新知