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("\n", "");
64             datas[indx] = datas[indx].Replace("\r", "");
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 }

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

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

时间: 2024-07-30 07:10:34

dicom网络通讯入门(1)的相关文章

dicom网络通讯入门(2)

转自:http://www.cnblogs.com/assassinx/p/3649498.html 第二篇,前面都是闲扯 其实正文现在才开始,这次是把压箱底的东西都拿出来了. 首先我们今天要干的事是实现一个echo响应测试工具 也就是echo 的scu,不是实现打印作业管理么.同学我告诉你还早着呢.本来标题取的就是<dicomviewer 第二弹 之 实现打印管理>名字多霸气,最后我又改回来了. 首先你得把数据组织方式搞懂 那就是pdu  和dimse  元素  数据元素.然后基于这之上你得

dicom网络通讯入门(3)

转自:http://www.cnblogs.com/assassinx/p/3649637.html 接下来可以进行消息传递了 ,也就是dimse ,再来复习下 什么是dimse .n-set  n-create c-echo 这些都是dimse  他们都是属于一种结构的pdu 那就是tf-pdu(传输数据和命令的都称之为tf-pdu 或者transfer pdu ,协商连接的都称之为associcate pdu) .dimse 由 许多tag组成,就像文件解析那篇博文一样.tf-pdu数据结构

java网络编程入门教程

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

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

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它.我们熟悉的web服务器底层依赖它,我们用到的MySQL关系数据库.Redis内存数据库底层依赖它.我们用微信和别

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

脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手 http://www.52im.net/thread-1729-1-1.html 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和"四次",但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方式,来对这个知识点进行"脑残式"讲解(哈哈),期望读者们可以更加简单.直观地理解TCP网络通信交互的本

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock

[转] C#.Net Socket网络通讯编程总结

1.理解socket1).Socket接口是TCP/IP网络的应用程序接口(API).Socket接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP网络应用程序.Socket可以看成是网络通信上的一个端点,也就是说,网络通信包括两台主机或两个进程,通过网络传递它们之间的数据.为了进行网络通信,程序在网络对话的每一端都需要一个Socket. 2).TCP/IP传输层使用协议端口将数据传送给一台主机的特定应用程序,从网络的观点看,协议端口是一个应用程序的进程地址.当传输层模块的网络软件模块

《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 注:ServerSuperIO有可能被移植到Windows 10 IOT上,那么将来有可能开发一套设备驱动,可以支行在服务端.嵌入式设备中,将形成完整的解决方案.       现在已经调试通过部分代码,还得需要一段时间,一般都是晚上干,时间也有限.如下图: 目       录 4.如开发一套设备驱动,同时支持串口和网络通讯... 2 4.1           概述... 2 4.2          

网络--三种网络通讯方式及Android的网络通讯机制

Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).下面分别介绍这些接口的功能和作用. 1.标准Java接口 java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接到服务器.向服务器写数据.从服务器读取