C-STORE: Clases para el envio sincrónico de imágenes por red.
Hecho en Netbeans 6.9
1. Abrir archivos correspondientes:
- En el paquete de descarga, entrar a: dcm4che-2.0.24/dcm4che-tool/
- Abrir nuevo proyecto (dcm4che, por ejemplo) y cargar servidor: buscar carpeta /dcm4che-tool-dcmsnd/src/main/java/org/dcm4che2/tool/dcmsnd y agregar al proyecto el archivo.
- Cargar en el mismo proyecto el cliente-> buscar en carpeta: dcm4che-tool-dcmrcv/src/main/java/org/dcm4che2/tool/dcmrcv y agregar todos los archivos.
2. Modificar archivos para su computador:
-En la carpeta del proyecto, en el src del servidor, buscar el archivo llamado DcmRcv.java. En él, modificar la linea donde se encuentran las siguientes variables:
private String keyStoreURL = "resource:/home/anamaria/Downloads/dcm4che-2.0.24LIBs/etc/tls/test_sys_2.p12";
private String trustStoreURL = "resource:/home/anamaria/Downloads/dcm4che-2.0.24LIBs/etc/tls/mesa_certs.jks";
poniendo su propio path de descarga de dcm4che.
- Como la entrada del archivo espera argumentos por consola, y nosotros lo corremos por Netbeans, toca tener una entrada alterna, como un archivo que tenga las entradas que se necesitan. En este caso, cree un archivo file.txt y (mirando la variable USAGE, puede ver cómo usar el servidor para sus necesidades) coloque las lineas de entrada necesitadas. Por ejemplo,
En NetBeansProjects/dcm4che/ colocamos, el file.txt con
FILE.TXT
DCMRCV
DCMRCV@localhost:11112
-dest
/home/anamaria/StoragePath
Donde DCMRCV es el nombre que se le da al servicio del servidor, DCMRCV@localhost:11112 es el nombreServidor@ipservidor:puertoAbiertoEnvioServidor, -dest comando para definir el destino del archivo a recibir, /home/anamaria/StoragePath el path del destino. Si desea más argumentos, debe modificar este archivo y las siguientes lineas dentro del main de DcmRcv.java:
@SuppressWarnings("unchecked")
public static void main(String[] args) throws FileNotFoundException {
File file = new File("file.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String[] argus = new String[4];
try {
argus[0] = br.readLine();
argus[1] = br.readLine();
argus[2] = br.readLine();
argus[3] = br.readLine();
} catch (IOException ioe) {
System.out.println("IO error trying to read your name!");
System.exit(1);
}
CommandLine cl = parse(
argus);
...
,,,
}
Donde lo que está remarcado en negrilla es lo que se va a agregar o cambiar. Si ud puso más de un comando dentro del File.txt, es necesario agregar tantas lineas de readline para que las pueda ejecutar todas de manera correcta.
-En la carpeta del proyecto, en el src del cliente, buscar el archivo llamado DcmSnd.java (único archivo que debe haber). Buscar las lineas donde se encuentran las siguientes variables y remplazar con su propio path:
private String keyStoreURL = "resource:/home/anamaria/Downloads/dcm4che-2.0.24LIBs/etc/tls/test_sys_2.p12";
private String trustStoreURL = "resource:/home/anamaria/Downloads/dcm4che-2.0.24LIBs/etc/tls/mesa_certs.jks";
Este archivo también espera entrada por consola, por lo que se debe crear un segundo archivo txt con las entradas necesarias. Por ejemplo, en NetBeansProjects/dcm4che/ colocamos, el send.txt con:
DCMRCV
DCMSNDV@localhost:11112
/home/anamaria/DICOMFIles/ct2.dcm
-stgcmt
-L
DCMRCV@localhost:5010
Donde: DCMRCV es el nombre del servicio que se quiere realizar. OJO: Es el mismo nombre que aparece en el file.txt del servidor. Si no es así, no se podrá establecer la conexión. DCMSNDV@localhost:11112 es nombreCliente@ipServidor:puertoAbiertoServidor. /home/anamaria/DICOMFIles/ct2.dcm es el path de la imagen DICOM que se desea transmitir. Si no se pone path, se asumirá el path del proyecto en Netbeans. -stgcmt es el comando que permite "request storage commitment of (successfully)sent objects afterwards in same association". -L set AET, local address and listening port of local Application Entity, use device name and pick up any valid local address to bind the socket by default=> DCMRCV@localhost:5010 es el servidor@ip:puertoDeRespuestadelStorageCommintment (debe ser distinto al de envio).
Si desea más argumentos, debe modificar este archivo y las siguientes lineas dentro del main de DcmSnd.java:
@SuppressWarnings("unchecked")
public static void main(String[] args) throws FileNotFoundException {
File file = new File("send.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String[] argus = new String[6];
//son 6 las lineas de mi archivo especificamente...
try {
argus[0] = br.readLine();
argus[1] = br.readLine();
argus[2] = br.readLine();
argus[3] = br.readLine();
argus[4] = br.readLine();
argus[5] = br.readLine();
} catch (IOException ioe) {
System.out.println("IO error trying to read your name!");
System.exit(1);
}
CommandLine cl = parse(
argus);
DcmSnd dcmsnd = new DcmSnd(cl.hasOption("device")
? cl.getOptionValue("device") : "DCMSND");
final List
argList = cl.getArgList();
String remoteAE = argList.get(0);
String[] calledAETAddress = split(remoteAE, '@');
dcmsnd.setCalledAET(calledAETAddress[0]);
System.out.println("calledAETname: "+calledAETAddress[0]);
System.out.println("calledAETAddress: "+calledAETAddress[0]);
if (calledAETAddress[1] == null) {
//en caso de que no reconozca algun argumento del archivo o no lo ponga, escogera por defecto el siguiente:
dcmsnd.setRemoteHost("localhost");
dcmsnd.setRemotePort(11112);
} else {
.....
.....
}
Donde lo que está remarcado en negrilla es lo que se va a agregar o cambiar. Si ud puso más de un comando dentro del send.txt, es necesario agregar tantas lineas de readline para que las pueda ejecutar todas de manera correcta.
Si todo fue realizado correctamente, deberia salir la siguiente respuesta
Servidor:
Start Server listening on port 11112
10:59:42,650 INFO - Start listening on localhost/127.0.0.1:11112
10:59:46,832 INFO - Association(1) accepted Socket[addr=/127.0.0.1,port=60789,localport=11112]
10:59:46,855 INFO - Association(1): A-ASSOCIATE-RQ DCMRCV >> DCMRCV
10:59:46,862 INFO - DCMRCV(1): A-ASSOCIATE-AC DCMRCV << DCMRCV
10:59:46,978 INFO - DCMRCV(1) >> 1:C-STORE-RQ[pcid=5, prior=0
cuid=1.2.840.10008.5.1.4.1.1.2/CT Image Storage
iuid=2.16.840.1.113662.2.1.4519.41582.4105152.419990505.410523251
ts=1.2.840.10008.1.2.1/Explicit VR Little Endian]
10:59:46,980 INFO - M-WRITE /home/anamaria/StoragePath/2.16.840.1.113662.2.1.4519.41582.4105152.419990505.410523251.part
10:59:46,998 INFO - M-RENAME /home/anamaria/StoragePath/2.16.840.1.113662.2.1.4519.41582.4105152.419990505.410523251.part to /home/anamaria/StoragePath/2.16.840.1.113662.2.1.4519.41582.4105152.419990505.410523251
10:59:46,999 INFO - DCMRCV(1) << 1:C-STORE-RSP[pcid=5, status=0H]
10:59:47,014 INFO - DCMRCV(1) >> 2:N-ACTION-RQ[pcid=1, actionID=1
cuid=1.2.840.10008.1.20.1/Storage Commitment Push Model SOP Class
iuid=1.2.840.10008.1.20.1.1
ts=1.2.840.10008.1.2/Implicit VR Little Endian]
10:59:47,018 INFO - DCMRCV(1) << 2:N-ACTION-RSP[pcid=1, actionID=null, status=0H]
10:59:48,027 INFO - Association(2) initiated Socket[addr=/127.0.0.1,port=5010,localport=60708]
10:59:48,027 INFO - DCMRCV(2): A-ASSOCIATE-RQ DCMRCV << DCMRCV
10:59:48,030 INFO - DCMRCV(2): A-ASSOCIATE-AC DCMRCV >> DCMRCV
10:59:48,031 INFO - DCMRCV(2) << 1:N-EVENT-REPORT-RQ[pcid=1, eventID=1
cuid=1.2.840.10008.1.20.1/Storage Commitment Push Model SOP Class
iuid=1.2.840.10008.1.20.1.1
ts=1.2.840.10008.1.2/Implicit VR Little Endian]
10:59:48,032 INFO - DCMRCV(2) >> 1:N-EVENT-REPORT-RSP[pcid=1, eventID=null, status=0H]
10:59:48,033 INFO - DCMRCV(2) << A-RELEASE-RQ
10:59:48,034 INFO - DCMRCV(1) >> A-RELEASE-RQ
10:59:48,034 INFO - DCMRCV(1) << A-RELEASE-RP
10:59:48,035 INFO - DCMRCV(2) >> A-RELEASE-RP
10:59:48,035 INFO - DCMRCV(2): close Socket[addr=/127.0.0.1,port=5010,localport=60708]
10:59:48,084 INFO - DCMRCV(1): close Socket[addr=/127.0.0.1,port=60789,localport=11112]
BUILD STOPPED (total time: 1 minute 15 seconds)
Cliente:
Scanning files to send
Scanned 1 files in 0.087s (=87ms/file)
Start Server listening on port 5010
10:59:46,799 INFO - Start listening on localhost/127.0.0.1:5010
10:59:46,844 INFO - Association(1) initiated Socket[addr=localhost/127.0.0.1,port=11112,localport=60789]
10:59:46,844 INFO - DCMRCV (1): A-ASSOCIATE-RQ DCMRCV << DCMRCV
10:59:46,864 INFO - DCMRCV (1): A-ASSOCIATE-AC DCMRCV >> DCMRCV
Connected to DCMRCV in 0.08s
10:59:46,882 INFO - DCMRCV (1) << 1:C-STORE-RQ[pcid=5, prior=0
cuid=1.2.840.10008.5.1.4.1.1.2/CT Image Storage
iuid=2.16.840.1.113662.2.1.4519.41582.4105152.419990505.410523251
ts=1.2.840.10008.1.2.1/Explicit VR Little Endian]
10:59:47,000 INFO - DCMRCV (1) >> 1:C-STORE-RSP[pcid=5, status=0H]
.
Sent 1 objects (=513.6406KB) in 0.136s (=3.688251MB/s)
10:59:47,013 INFO - DCMRCV (1) << 2:N-ACTION-RQ[pcid=1, actionID=1
cuid=1.2.840.10008.1.20.1/Storage Commitment Push Model SOP Class
iuid=1.2.840.10008.1.20.1.1
ts=1.2.840.10008.1.2/Implicit VR Little Endian]
10:59:47,019 INFO - DCMRCV (1) >> 2:N-ACTION-RSP[pcid=1, actionID=null, status=0H]
Request Storage Commitment from DCMRCV in 0.018s
Waiting for Storage Commitment Result..
10:59:48,027 INFO - Association(2) accepted Socket[addr=/127.0.0.1,port=60708,localport=5010]
10:59:48,029 INFO - Association(2): A-ASSOCIATE-RQ DCMRCV >> DCMRCV
10:59:48,030 INFO - DCMRCV(2): A-ASSOCIATE-AC DCMRCV << DCMRCV
10:59:48,032 INFO - DCMRCV(2) >> 1:N-EVENT-REPORT-RQ[pcid=1, eventID=1
cuid=1.2.840.10008.1.20.1/Storage Commitment Push Model SOP Class
iuid=1.2.840.10008.1.20.1.1
ts=1.2.840.10008.1.2/Implicit VR Little Endian]
10:59:48,032 INFO - DCMRCV(2) << 1:N-EVENT-REPORT-RSP[pcid=1, eventID=null, status=0H]
Received Storage Commitment Result after 1.014s:
1 successful
10:59:48,033 INFO - DCMRCV(2) >> A-RELEASE-RQ
10:59:48,034 INFO - DCMRCV(2) << A-RELEASE-RP
10:59:48,034 INFO - DCMRCV (1) << A-RELEASE-RQ
10:59:48,034 INFO - DCMRCV (1) >> A-RELEASE-RP
Released connection to DCMRCV
10:59:48,034 INFO - DCMRCV (1): close Socket[addr=localhost/127.0.0.1,port=11112,localport=60789]
10:59:48,084 INFO - DCMRCV(2): close Socket[addr=/127.0.0.1,port=60708,localport=5010]
10:59:49,035 INFO - Stop listening on localhost/127.0.0.1:5010
BUILD SUCCESSFUL (total time: 2 seconds)