DICOM-SCP,可以直接使用的SCP(.net framework 4.6.1以上)控制台接收端
此程序只能运行在.net framework 4.6.1版本上的环境,如果要运行在低版本环境,请看上一篇文档
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using FellowOakDicom.Imaging.Codec;
using FellowOakDicom.Log;
using FellowOakDicom.Network;
using System.Configuration; namespace FellowOakDicom.Samples.CStoreSCP
{
internal class Program
{ private static readonly string _storagePath = ConfigurationManager.AppSettings["StoragePath"]; private static readonly int _port = int.Parse(ConfigurationManager.AppSettings["Port"]); private static readonly string _calledAE = ConfigurationManager.AppSettings["CalledAE"]; private static void Main(string[] args)
{
//var url = ConfigurationManager.AppSettings["StoragePath"]; // start DICOM server on port from command line argument or 11112
//var port = args != null && args.Length > 0 && int.TryParse(args[0], out int tmp) ? tmp : 11112;
var port = _port;
Console.WriteLine($"正在端口上启动C-Store SCP服务器,端口:{port},LocalAE:{_calledAE}"); using (var server = DicomServerFactory.Create<CStoreSCP>(port))
{
// end process
Console.WriteLine("按<return>结束。。。");
Console.ReadLine();
}
} private class CStoreSCP : DicomService, IDicomServiceProvider, IDicomCStoreProvider, IDicomCEchoProvider
{
private static readonly DicomTransferSyntax[] _acceptedTransferSyntaxes = new DicomTransferSyntax[]
{
DicomTransferSyntax.ExplicitVRLittleEndian,
DicomTransferSyntax.ExplicitVRBigEndian,
DicomTransferSyntax.ImplicitVRLittleEndian
}; private static readonly DicomTransferSyntax[] _acceptedImageTransferSyntaxes = new DicomTransferSyntax[]
{
// Lossless
DicomTransferSyntax.JPEGLSLossless,
DicomTransferSyntax.JPEG2000Lossless,
DicomTransferSyntax.JPEGProcess14SV1,
DicomTransferSyntax.JPEGProcess14,
DicomTransferSyntax.RLELossless,
// Lossy
DicomTransferSyntax.JPEGLSNearLossless,
DicomTransferSyntax.JPEG2000Lossy,
DicomTransferSyntax.JPEGProcess1,
DicomTransferSyntax.JPEGProcess2_4,
// Uncompressed
DicomTransferSyntax.ExplicitVRLittleEndian,
DicomTransferSyntax.ExplicitVRBigEndian,
DicomTransferSyntax.ImplicitVRLittleEndian
}; public CStoreSCP(INetworkStream stream, Encoding fallbackEncoding, ILogger log, ILogManager logManager, INetworkManager network, ITranscoderManager transcoder)
: base(stream, fallbackEncoding, log, logManager, network, transcoder)
{
} public Task OnReceiveAssociationRequestAsync(DicomAssociation association)
{
if (association.CalledAE != _calledAE)
{
return SendAssociationRejectAsync(
DicomRejectResult.Permanent,
DicomRejectSource.ServiceUser,
DicomRejectReason.CalledAENotRecognized);
} foreach (var pc in association.PresentationContexts)
{
if (pc.AbstractSyntax == DicomUID.Verification)
{
pc.AcceptTransferSyntaxes(_acceptedTransferSyntaxes);
}
else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None)
{
pc.AcceptTransferSyntaxes(_acceptedImageTransferSyntaxes);
}
} return SendAssociationAcceptAsync(association);
} public Task OnReceiveAssociationReleaseRequestAsync()
{
return SendAssociationReleaseResponseAsync();
} public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason)
{
/* nothing to do here */
} public void OnConnectionClosed(Exception exception)
{
/* nothing to do here */
} public async Task<DicomCStoreResponse> OnCStoreRequestAsync(DicomCStoreRequest request)
{
var studyUid = request.Dataset.GetSingleValue<string>(DicomTag.StudyInstanceUID).Trim();
var instUid = request.SOPInstanceUID.UID; var path = Path.GetFullPath(Program._storagePath);
path = Path.Combine(path, studyUid); if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
} path = Path.Combine(path, instUid) + ".dcm"; await request.File.SaveAsync(path); return new DicomCStoreResponse(request, DicomStatus.Success);
} public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e)
{
// let library handle logging and error response
return Task.CompletedTask;
} public Task<DicomCEchoResponse> OnCEchoRequestAsync(DicomCEchoRequest request)
{
return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success));
} }
}
}
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration> <appSettings>
<add key="StoragePath" value="MYDICOM/"/>
<add key="Port" value="11112"/>
<add key="CalledAE" value="STORESCP9230"/>
</appSettings> </configuration>
DICOM-SCP,可以直接使用的SCP(.net framework 4.6.1以上)控制台接收端的更多相关文章
- scp命令报错-bash: scp: command not found
# scp -bash: scp: command not found # which scp /usr/bin/scp # rpm -qf /usr/bin/scp openssh-clients- ...
- dicom 影像通信(scu、scp)的c-echo、c-store、c-find、c-move
本文主要描述,dicom通信的scu,scp的c-echo.c-store.c-find.c-move的使用. DicomServiceIDicomServiceProviderIDicomCStor ...
- scp 基本用法(提高scp传输速度)
Outline spc 可以帮你实现: Linux Server 之间互传数据: Linux Server 和 Windows Server 之间互传数据: 参考: https://www.cnblo ...
- scp报错 -bash: scp: command not found
环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...
- linux之cp/scp命令+scp命令详解
名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... directory 说明:将一个档案拷贝至另一档案,或将数 ...
- Linux学习之三--scp命令
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- scp 上传文件到多个服务器节点
参考:scp批量上传文件到多台机器上(升级版) 实测,代码可运行. 1.如果遇到syntax error near unexpected token问题,基本是由于windows环境下编写的shell ...
- scp命令详解
\ svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解 名称:cp 使用权限: ...
- linux命令-cp/scp {拷贝}
一 命令解释 名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... directory 命令参数: -a 尽可能 ...
- scp详解
scp 命令 ================== scp 可以在 2个 linux 主机间复制文件: 命令基本格式: scp [可选参数] file_source file_targe ...
随机推荐
- chcapter 11 熵和信息
Entropy and information 熵:度量一个物理系统中的态的不确定度. 注意: 文中出现的' 凸性' convexity 和 ' 凹性' concavity 的在不同的教材中可能含义 ...
- DDCA —— 大缓存、虚拟内存:多核缓存、NUCA缓存、页表等
1. 缓存中的多核问题 1.1 多核系统中的缓存 Intel Montecito缓存 两个 core,每个都有一个私有的12 MB的L3缓存和一个1 MB的L2缓存,图中深蓝色部分均为L3缓存. 在多 ...
- floyd 算法——P1119 灾后重建
floyd 算法 是图论中较为简单的最短路算法,但在某些方面远超最短路范围. 算法思路 定义 \(f[x][y]\) 为 \(x\) 到 \(y\) 节点的最短路径. 初始化:若存在边 \((x,y) ...
- Auto-Encoding Variational Bayes (VAE原文)、变分推理
变分自动编码器的大致概念已经理解了快一年多了,但是其中的数学原理还是没有搞懂,在看到相关的变体时,总会被数学公式卡住.下决心搞懂后,在此记录下我的理解. 公式推导--变分下界 这篇文章提出一种拟合数据 ...
- python SQLAlchemy 查询慢sql
1.config文件添加如下配置 FLASKY_DB_QUERY_TIMEOUT = 0.1 # 设置sql执行超时时间 0.1s SQLALCHEMY_RECORD_QUERIES = True # ...
- 曾经做的一个JS小游戏——《Battle City》
今天改网盘密码时,找到了个很久前的东西:JavaScript版的坦克大战.07年的夏天制作花了好多个夜晚制作,那段着迷JS游戏的疯狂时光.但因为后来众多浏览器的出现,导致了游戏兼容性大大的下降,最终放 ...
- echarts 的使用
<template> // option 通过id行绑定 <div id="myRangChart" style="width: 100%;he ...
- Cython二进制逆向系列(一) 初识Cython
Cython二进制逆向系列(一) 初识Cython 众所周知,Python类题目最难的一种就是使用Cython工具将py源码转换为二进制文件.此类题目相比于直接由Cpython编译而成的类字节码文 ...
- cmu15545笔记-WAL和数据库恢复
目录 总览 缓存策略(Buffer Pool Policies) Shadow Paging(No-Steal + Force) SQLite Rollback Mode(Steal + Force) ...
- C#生成二维码的两种方式(快看二维码)
前言 最近在做项目的时候遇到一个需求是将文本内容生成二维码图片的,对于这个需求那就直接上手(两种方法,我比较喜欢第二种方式,往上面也是有很多的方法.这里只作为个人纪录) 方法一:ThoughtWork ...