Edited at

nc(netcat)を普通にJAVAで作っておりましたが

More than 1 year has passed since last update.

エリアAから事務所向けのAIR回線の実速度を上げるため間にlz4を入れようとした。

そのために標準入出力が相手となりそれをTCP経由で送受信する仕組みが必要だった。

調べると最高のツールがあったnc(netcat)

(仕掛けhttp://www.intellilink.co.jp/sites/default/files/imported/article/column/sec-network01.png を参照)

しかしこやつはエリアAでダウンロードするとバスターに蹴られてしまう。

無視して入れるなど出来ない私はこやつをJAVAで作ったというだけの記録。

PG:


ncJava.java

package ncjava;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ncJava {

public static void main(String[] args) throws Exception{
if (args.length!=2) {
System.err.println(
"USAGE: ncJava toSTD/toTCP TCPIP:PORT"
);
return;
}
if (args[0].toUpperCase().equals("TOSTD")) {
//Server TCP to STDOUT
ServerSocket ss = new ServerSocket(
new Integer(args[1].replaceAll("^([^:]+):(.+)$", "$2")) //PortPart
,0
,InetAddress.getByName(args[1].replaceAll("^([^:]+):(.+)$", "$1")) //IPpart
);
Socket as = null;
System.err.println("stby:"+ss+" to STDOUT");
try {
while((as = ss.accept()) != null ) {
System.err.println("recive from TCP:"+as);

byte buf[] = new byte[1024];
int r = 0;
while ((r=as.getInputStream().read(buf))!=-1) {
System.out.write(buf,0,r);
System.out.flush();
}
System.err.println("disconnect TCP:"+as);
}
} finally {if (ss != null) ss.close();}
return;

}else if (args[0].toUpperCase().equals("TOTCP")) {
//Server STDIN to TCP
Socket sc = new Socket(
InetAddress.getByName(args[1].replaceAll("^([^:]+):(.+)$", "$1")) //IPpart
,new Integer(args[1].replaceAll("^([^:]+):(.+)$", "$2")) //PortPart
);
System.err.println("stby to:"+sc+" from STDIN");
try {
byte buf[] = new byte[1024];
int r = 0;
while ((r=System.in.read(buf))!=-1) {
System.err.println("recive from STDIN:"+r);
sc.getOutputStream().write(buf,0,r);
sc.getOutputStream().flush();
}
System.err.println("disconnect STDIN:");
} finally {if (sc != null) sc.close();}
return;
}
}
}


テスト結果:

送信側

E:\MrServer>echo "testa" |java -jar ncJava.jar TOTCP localhost:9999

stby to:Socket[addr=localhost/127.0.0.1,port=9999,localport=54726] from STDIN

recive from STDIN:10

disconnect STDIN:

E:\MrServer>

受信側

E:\MrServer>java -jar ncJava.jar TOSTD localhost:9999

stby:ServerSocket[addr=localhost/127.0.0.1,port=0,localport=9999] to STDOUT

recive from TCP:Socket[addr=/127.0.0.1,port=54726,localport=9999]

"testa"

disconnect TCP:Socket[addr=/127.0.0.1,port=54726,localport=9999]

送信側

E:\MrServer>type file.txt

"engbJapan"

"hhhhhhh"

E:\MrServer>java -jar ncJava.jar TOTCP localhost:9999 <file.txt

stby to:Socket[addr=localhost/127.0.0.1,port=9999,localport=54728] from STDIN

recive from STDIN:26

disconnect STDIN:

E:\MrServer>

受信側

recive from TCP:Socket[addr=/127.0.0.1,port=54728,localport=9999]

"engbJapan"

"hhhhhhh"

disconnect TCP:Socket[addr=/127.0.0.1,port=54728,localport=9999]

以上。