Windows ์ฝ์ ์ ํธ๋ฆฌํฐ์ ์ฌ์ฉ์ ์ ์ ๊ตฌํ์ ๊ดํ ์ง์์ ์ธ ๊ธฐ์ฌ ์๋ฆฌ์ฆ๋ฅผ ๊ณ์ํ๋ฉด์ ๊ฐ๋จํ ํ์ผ ์ ์ก ํ๋กํ ์ฝ์ธ TFTP(Trivial File Transfer Protocol)์ ๋ํด ๋ค๋ฃจ์ง ์์ ์ ์์ต๋๋ค.
์ง๋๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๋จํ ์ด๋ก ์ ์ดํด๋ณด๊ณ , ํ์ํ ๊ธฐ๋ฅ๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค. ์์ธํ ๋ด์ฉ - ์ปท ์๋
์ ํต์ ์ผ๋ก ๊ธฐ์ฌ ๋๋ถ๋ถ์์ ์ฐพ์ ์ ์๋ ๋งํฌ์ธ ์ฐธ์กฐ ์ ๋ณด๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ง๋ ์๊ฒ ์ต๋๋ค. ํต์ฌ์ ์ผ๋ก TFTP๋ ์ก์ธ์ค ์ ์ด ์ค์ ์ด ์๋ FTP ํ๋กํ ์ฝ์ ๋จ์ํ๋ ๋ณํ์ด๋ผ๊ณ ๋ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ ๊ฑฐ๋์์ผ๋ฉฐ ์ค์ ๋ก ํ์ผ ์์ ๋ฐ ์ ์ก ๋ช ๋ น ์ธ์๋ ์๋ฌด๊ฒ๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌํ์ ์ข ๋ ์ฐ์ํ๊ฒ ๋ง๋ค๊ณ ํ์ฌ ์ฝ๋ ์์ฑ ์์น์ ๋ง๊ฒ ์ ์ฉํ๊ธฐ ์ํด ๊ตฌ๋ฌธ์ด ์ฝ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ด๋ก ์ธํด ์๋ ์์น์ด ๋ณ๊ฒฝ๋์ง๋ ์์ง๋ง ์ธํฐํ์ด์ค IMHO๋ ์ข ๋ ๋ ผ๋ฆฌ์ ์ด๊ณ FTP์ TFTP์ ๊ธ์ ์ ์ธ ์ธก๋ฉด์ ๊ฒฐํฉํฉ๋๋ค.
ํนํ, ์์๋๋ฉด ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ IP ์ฃผ์์ ์ฌ์ฉ์ ์ ์ TFTP๊ฐ ์ด๋ ค ์๋ ํฌํธ๋ฅผ ์์ฒญํฉ๋๋ค(ํ์ค ํ๋กํ ์ฝ๊ณผ์ ๋นํธํ์ฑ์ผ๋ก ์ธํด ์ฌ์ฉ์๊ฐ ํฌํธ๋ฅผ ์ ํํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ์๊ฐํจ). ์ฐ๊ฒฐ์ด ๋ฐ์ํ๋ฉด ํด๋ผ์ด์ธํธ๋ get ๋๋ put ๋ช ๋ น ์ค ํ๋๋ฅผ ๋ณด๋ด ์๋ฒ์ ํ์ผ์ ๋ฐ๊ฑฐ๋ ๋ณด๋ผ ์ ์์ต๋๋ค. ๋ชจ๋ ํ์ผ์ ๋ ผ๋ฆฌ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๋ก ์ ์ก๋ฉ๋๋ค.
ํ๋กํ ์ฝ์ ๊ตฌํํ๊ธฐ ์ํด ์ ํต์ ์ผ๋ก 4๊ฐ์ง ํด๋์ค๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- TFTPํด๋ผ์ด์ธํธ
- TFTP์๋ฒ
- TFTPํด๋ผ์ด์ธํธํ ์คํฐ
- TFTP์๋ฒํ ์คํฐ
ํ ์คํธ ํด๋์ค๋ ์ฃผ์ ํด๋์ค ๋๋ฒ๊น ์ ์ํด์๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ถ์ํ์ง๋ ์๊ฒ ์ง๋ง ์ฝ๋๋ ์ ์ฅ์์ ์์ ๊ฒ์ด๋ฉฐ ์ด์ ๋ํ ๋งํฌ๋ ๊ธฐ์ฌ ๋๋ถ๋ถ์์ ์ฐพ์ ์ ์์ต๋๋ค. ์ด์ ์ฃผ์ ์์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
TFTPํด๋ผ์ด์ธํธ
์ด ํด๋์ค์ ์๋ฌด๋ IP์ ํฌํธ ๋ฒํธ๋ก ์๊ฒฉ ์๋ฒ์ ์ฐ๊ฒฐํ๊ณ , ์ ๋ ฅ ์คํธ๋ฆผ(์ด ๊ฒฝ์ฐ ํค๋ณด๋)์์ ๋ช ๋ น์ ์ฝ๊ณ , ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ , ์๋ฒ๋ก ์ ์กํ๋ ๊ฒ์ ๋๋ค. ํ์ผ์ ๋ณด๋ด๊ฑฐ๋ ๋ฐ๊ณ , ์ ์กํ๊ฑฐ๋ ๋ฐ์์ผ ํฉ๋๋ค.
์๋ฒ์ ์ฐ๊ฒฐํ๊ณ ์ ๋ ฅ ์คํธ๋ฆผ์ ๋ช ๋ น์ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๋ฅผ ์์ํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ์ ์ญ ๋ณ์๋ ๊ธฐ์ฌ ์ธ๋ถ์ ํ๋ก๊ทธ๋จ ์ ์ฒด ํ ์คํธ์ ์ค๋ช ๋์ด ์์ต๋๋ค. ๊ทธ ์ฌ์ํจ ๋๋ฌธ์ ๊ธฐ์ฌ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ์ธ์ฉํ์ง ์์ต๋๋ค.
public void run(String ip, int port)
{
this.ip = ip;
this.port = port;
try {
inicialization();
Scanner keyboard = new Scanner(System.in);
while (isRunning) {
getAndParseInput(keyboard);
sendCommand();
selector();
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
์ด ์ฝ๋ ๋ธ๋ก์์ ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์์ ํ์ผ์ด ์ ์ก๋ฉ๋๋ค. ์ค์บ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ๋ด์ฉ์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ํ์ํฉ๋๋ค. ์ด๋ฅผ ์์ผ์ ํ๋์ฉ ์ด ๋ค์ ํ์ผ์ ๋ซ์๋ค๊ฐ ๋ค์ ์ฝ๋๋ค(๊ฐ์ฅ ํ์คํ ํด๊ฒฐ์ฑ ์ ์๋์ง๋ง ์ด๋ ๋ฆฌ์์ค ํด์ ๋ฅผ ๋ณด์ฅํฉ๋๋ค. ๊ทธ ํ ์ฑ๊ณต์ ์ธ ์ ์ก์ ๋ํ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
private void put(String sourcePath, String destPath)
{
File src = new File(sourcePath);
try {
InputStream scanner = new FileInputStream(src);
byte[] bytes = scanner.readAllBytes();
for (byte b : bytes)
sout.write(b);
sout.close();
inicialization();
System.out.println("nDonen");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
์ด ์ฝ๋ ๋จํธ์ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋ค์ ์ฌ์ํ๋ฉฐ ์ฒซ ๋ฒ์งธ ์ฝ๋ ๋ธ๋ก๋ง ๊ด์ฌ์ด ์์ต๋๋ค. ์์ผ์์ ์ฝ์ด์ผ ํ๋ ๋ฐ์ดํธ ์๋ฅผ ์ ํํ ์ดํดํ๋ ค๋ฉด ์ ์ก๋ ํ์ผ์ ๋ฌด๊ฒ๋ฅผ ์์์ผ ํฉ๋๋ค. ์๋ฒ์ ํ์ผ ํฌ๊ธฐ๋ ๊ธด ์ ์๋ก ํ์๋๋ฏ๋ก ์ฌ๊ธฐ์๋ 4๋ฐ์ดํธ๊ฐ ํ์ฉ๋๋ฉฐ ์ดํ์๋ ํ๋์ ์ซ์๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ Java ์ ๊ทผ ๋ฐฉ์์ด ์๋๋ฉฐ SI์ ์ ์ฌํ์ง๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํด์ง๋๋ค. ์์ผ์์ ์๋ ค์ง ๋ฐ์ดํธ ์๋ฅผ ์์ ํ์ฌ ํ์ผ์ ์ด ํ ์ฑ๊ณต ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
private void get(String sourcePath, String destPath){
long sizeOfFile = 0;
try {
byte[] sizeBytes = new byte[Long.SIZE];
for (int i =0; i< Long.SIZE/Byte.SIZE; i++)
{
sizeBytes[i] = (byte)sin.read();
sizeOfFile*=256;
sizeOfFile+=sizeBytes[i];
}
FileOutputStream writer = new FileOutputStream(new File(destPath));
for (int i =0; i < sizeOfFile; i++)
{
writer.write(sin.read());
}
writer.close();
System.out.println("nDONEn");
}
catch (Exception e){
System.out.println(e.getMessage());
}
}
ํด๋ผ์ด์ธํธ ์ฐฝ์ get ๋๋ put ์ด์ธ์ ๋ช ๋ น์ ์ ๋ ฅํ ๊ฒฝ์ฐ showErrorMessage ํจ์๊ฐ ํธ์ถ๋์ด ์ ๋ ฅ์ด ์๋ชป๋์์์ ๋ํ๋ ๋๋ค. ์ฌ์ํด์ ์ธ์ฉํ์ง ์๊ฒ ์ต๋๋ค. ์ข ๋ ํฅ๋ฏธ๋ก์ด ์ ์ ์ ๋ ฅ ๋ฌธ์์ด์ ์์ ํ๊ณ ๋ถํ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ค์บ๋๋ฅผ ์ฌ๊ธฐ์ ์ ๋ฌํ๋ฉด ๋ ๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๊ณ ๋ช ๋ น, ์์ค ์ฃผ์ ๋ฐ ๋์ ์ฃผ์๊ฐ ํฌํจ๋ ์ค์ ๋ฐ์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
private void getAndParseInput(Scanner scanner)
{
try {
input = scanner.nextLine().split(" ");
typeOfCommand = input[0];
sourcePath = input[1];
destPath = input[2];
}
catch (Exception e) {
System.out.println("Bad input");
}
}
๋ช ๋ น ๋ณด๋ด๊ธฐ - ์ค์บ๋์์ ์ ๋ ฅํ ๋ช ๋ น์ ์์ผ์ผ๋ก ์ ์กํ๊ณ ๊ฐ์ ๋ก ์ ์กํฉ๋๋ค.
private void sendCommand()
{
try {
for (String str : input) {
for (char ch : str.toCharArray()) {
sout.write(ch);
}
sout.write(' ');
}
sout.write('n');
}
catch (Exception e) {
System.out.print(e.getMessage());
}
}
์ ํ๊ธฐ๋ ์ ๋ ฅ๋ ๋ฌธ์์ด์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ๋์์ ๊ฒฐ์ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ณ๋ก ์๋ฆ๋ต์ง ์์ผ๋ฉฐ ์ฌ์ฉ๋ ํธ๋ฆญ์ ์ฝ๋ ๋ธ๋ก ์ธ๋ถ์์ ๊ฐ์ ์ข ๋ฃํ๋ ๊ฐ์ฅ ์ข์ ํธ๋ฆญ์ ์๋์ง๋ง, ๊ทธ ์ฃผ๋ ์ด์ ๋ Java์ C#์ ๋๋ฆฌ์, C++์ ํจ์ ํฌ์ธํฐ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ต์ํ ๋์ฐํ๊ณ ๋์ฐํ goto๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ์๋ฆ๋ต๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ์ข ๋ ์ฐ์ํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๊ณ ๊ณ์๋ค๋ฉด ๋๊ธ๋ก ๋นํ์ ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฌธ์์ด ์์ ์ฌ์ ์ด ํ์ํ ๊ฒ ๊ฐ์๋ฐ ์์์๊ฐ ์์ต๋๋ค...
private void selector()
{
do{
if (typeOfCommand.equals("get")){
get(sourcePath, destPath);
break;
}
if (typeOfCommand.equals("put")){
put(sourcePath, destPath);
break;
}
showErrorMessage();
}
while (false);
}
}
TFTP์๋ฒ
์๋ฒ์ ๊ธฐ๋ฅ์ ๋ช ๋ น์ด ํค๋ณด๋๊ฐ ์๋ ์์ผ์์ ์ ๋ฌ๋๋ค๋ ์ ์์๋ง ํด๋ผ์ด์ธํธ์ ๊ธฐ๋ฅ๊ณผ ๋์ฒด๋ก ๋ค๋ฆ ๋๋ค. ์ผ๋ถ ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ผํ๋ฏ๋ก ์ธ์ฉํ์ง ์๊ณ ์ฐจ์ด์ ๋ง ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
์์ํ๋ ค๋ฉด ํฌํธ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๊ณ ์์ผ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ํ ๋ฃจํ๋ก ์ฒ๋ฆฌํ๋ run ๋ฉ์๋๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
public void run(int port) {
this.port = port;
incialization();
while (true) {
getAndParseInput();
selector();
}
}
ํ์ผ์ ๋ํ ์ฐ๊ธฐ ์คํธ๋ฆผ์ ์ด๊ณ ์์ผ์ ๋ชจ๋ ์ ๋ ฅ ๋ฐ์ดํธ๋ฅผ ์ฐ๋ writeToFileFromSocket ๋ฉ์๋๋ฅผ ๋ํํ๋ put ๋ฉ์๋๋ ์ฐ๊ธฐ๊ฐ ์๋ฃ๋๋ฉด ์ ์ก์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์์ ๋ํ๋ด๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
private void put(String source, String dest){
writeToFileFromSocket();
System.out.print("nDonen");
};
private void writeToFileFromSocket()
{
try {
FileOutputStream writer = new FileOutputStream(new File(destPath));
byte[] bytes = sin.readAllBytes();
for (byte b : bytes) {
writer.write(b);
}
writer.close();
}
catch (Exception e){
System.out.println(e.getMessage());
}
}
get ๋ฉ์๋๋ ์๋ฒ ํ์ผ์ ๊ฒ์ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ ์ธก ์น์ ์์ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ํ์ผ์ ์ฑ๊ณต์ ์ผ๋ก ์ ์กํ๋ ค๋ฉด ๊ธด ์ ์๋ก ์ ์ฅ๋ ํฌ๊ธฐ๋ฅผ ์์์ผ ํ๋ฏ๋ก ์ด๋ฅผ 4๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๋ถํ ํ์ฌ ๋ฐ์ดํธ ๋จ์๋ก ์ ์กํฉ๋๋ค. ์์ผ์ ์ฐ๊ฒฐํ ๋ค์ ํด๋ผ์ด์ธํธ์์ ์ด๋ฅผ ๋ฐ์ ์ซ์๋ก ๋ค์ ์กฐํฉํ ํ ํ์ผ์ ๊ตฌ์ฑํ๋ ๋ชจ๋ ๋ฐ์ดํธ๋ฅผ ํ์ผ์ ์ ๋ ฅ ์คํธ๋ฆผ์์ ์ฝ์ ํ ์ ์กํฉ๋๋ค.
private void get(String source, String dest){
File sending = new File(source);
try {
FileInputStream readFromFile = new FileInputStream(sending);
byte[] arr = readFromFile.readAllBytes();
byte[] bytes = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(sending.length()).array();
for (int i = 0; i<Long.SIZE / Byte.SIZE; i++)
sout.write(bytes[i]);
sout.flush();
for (byte b : arr)
sout.write(b);
}
catch (Exception e){
System.out.println(e.getMessage());
}
};
getAndParseInput ๋ฉ์๋๋ ํด๋ผ์ด์ธํธ์ ๋์ผํ๋ฉฐ ์ ์ผํ ์ฐจ์ด์ ์ ํค๋ณด๋๊ฐ ์๋ ์์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค๋ ๊ฒ์
๋๋ค. ์ฝ๋๋ ์ ํ๊ธฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฅ์์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์ด๊ธฐํ๋ ๋ณ๋์ ์ฝ๋ ๋ธ๋ก์ ๋ฐฐ์น๋ฉ๋๋ค. ์ด ๊ตฌํ ๋ด์์๋ ์ ์ก์ด ์๋ฃ๋ ํ ๋ฆฌ์์ค๊ฐ ํด์ ๋๊ณ ๋ค์ ์ ์ ๋์ด ๋ค์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ํ ๋ณดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
private void incialization()
{
try {
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
sin = socket.getInputStream();
sout = socket.getOutputStream();
}
catch (Exception e) {
System.out.print(e.getMessage());
}
}
์์ฝ :
์ฐ๋ฆฌ๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ก ํ๋กํ ์ฝ์ ๋ํ ๋ณํ์ ์์ฑํ๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง ์์๋์ต๋๋ค. ์์น์ ์ผ๋ก ๋๋ ์ฌ๊ธฐ์ ๋ฏธ๊ตญ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ๊ณ ์๋ก์ด ๊ฒ์ ๋ง์ด ์ฐ์ง ์์์ง๋ง Habrรฉ์ ๋ํ ์ ์ฌํ ๊ธฐ์ฌ๋ ์์์ผ๋ฉฐ cmd ์ ํธ๋ฆฌํฐ์ ๋ํ ์ผ๋ จ์ ๊ธฐ์ฌ๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ๊ทธ๊ฒ์ ๊ฑด๋๋ฆฌ์ง ์๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
๋งํฌ :
์ถ์ฒ : habr.com