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 ...
随机推荐
- MySQL原理简介—2.InnoDB架构原理和执行流程
大纲 1.更新语句在MySQL中是如何执行的 2.重要的内存结构-Buffer Pool缓冲池 3.undo日志文件如何让更新的数据可以回滚 4.更新Buffer Pool缓冲池中的缓存数据 5.Re ...
- Transformers包使用记录
Transformers是著名的深度学习预训练模型集成库,包含NLP模型最多,CV等其他领域也有,支持预训练模型的快速使用和魔改,并且模型可以快速在不同的深度学习框架间(Pytorch/Tensorf ...
- Java深度历险(一)——Java字节代码的操纵
[编者按]Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于Java语言的深度理解和运用,毕竟是很少会有人涉及的 ...
- python之APScheduler
介绍 APScheduler是Python中一个强大的第三方库,用于在后台执行定时任务.它允许我们根据设定的时间间隔.日期规则或特定时间来执行任务,适用于定时执行脚本.定时发送邮件.定时处理数据等场景 ...
- python之pyecharts
文档:https://pyecharts.org/ 安装: pip install pyecharts 示例: from pyecharts.charts import Bar from pyecha ...
- 简单理解Linux File的操作
类Unix系统是支持多个进程打开同一个文件,进行读写. 得益于类Unix系统对于文件操作的特殊设计. 分为三个数据结构 进程表项:其中包含进程中打开的文件和设备的文件描述符.还包含该文件描述符对应的文 ...
- windows 上部署 kafka 做测试
1.下载 需要下载 zookeeper 和kafka 我下载的版本是 2.部署 2.1 部署 zookeeper 2.1.1 新建配置文件 zoo.cfg 内容为 tickTime = 2000 da ...
- 【Amadeus原创】SQL Server查询某数据库所有表名行数和空间占用率
` select object_name(id) tablename, 8reserved/1024 reserved, rtrim(8dpages)+'kb' used, 8(reserved-dp ...
- 【C语言】【二级】移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p的数组元素平移到数组的最后
题目 请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p, p小于等于n-1)的数组元素平移到数组的最后. 例如,一维数组中的原始内容为:1,2,3,4 ...
- 【前端】【样式】CSS居中的三种方式
@charset "utf-8"; /* CSS Document */ /** *开发者:萌狼蓝天 *当前版本:v0.1[Debug] *最后更新日期:20210918 **/ ...