메모장 입니다2

자바] 5.10 본문

Study/학교수업

자바] 5.10

Wooum@n 2017. 5. 10. 16:53

//clnt


package jaava;


import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.util.Scanner;

import java.util.regex.Pattern;

 



public class FileClnt {

public static void main(String[] args) {

// TODO Auto-generated method stub

CommandCalc cmdC = new CommandCalc();

Scanner sc = new Scanner(System.in);

cmdC.printINTRO();

int ret = 0;

while(ret!=CommandCalc.EnumValue.RETURN_QUIT)

{

System.out.print(cmdC.shell);

String input= sc.nextLine();

ret = cmdC.selectCmd(input);

}

cmdC.printENDING();

}

}




class CommandCalc

{

public final int myPosition = EnumValue.POSITION_CLIENT;

public String shell = null;

private String[] argv = null;

int out_stream = EnumValue.OUT_CONSOLE; 

Socket sock = null;

private String currentPath = null;

class EnumValue{

public static final int RETURN_QUIT=-1;

public static final int RETURN_SUCCESS=1;

public static final int RETURN_INVALID=2;

public static final String SHELL_CONNECT="Connected>";

public static final String SHELL_LOCAL="Local>";

public static final int OUT_CONSOLE=9;

public static final int OUT_SOCKET=0;

public static final int POSITION_SERVER=5;

public static final int POSITION_CLIENT=6;


}

CommandCalc()

{

this.initMem();

this.currentPath = System.getProperty("user.dir");

this.shell = CommandCalc.EnumValue.SHELL_LOCAL;

}

public void initMem()

{

this.argv=null;

}

 

public void myPrint(String str, Socket... socket)

{

//콘솔 출력

if(out_stream == CommandCalc.EnumValue.OUT_CONSOLE)

{

System.out.println(str);

}

//소켓 출력

else if(out_stream == CommandCalc.EnumValue.OUT_SOCKET)

{


//매개변수로 소켓이 전달될 경우, 해당 소켓으로 전송.

for(Socket s: socket)

{

sock = s;

}

OutputStream os = null;

   OutputStreamWriter osw = null;

   BufferedWriter bw = null;

       

       try{

           os = sock.getOutputStream();

           osw = new OutputStreamWriter(os);

           bw = new BufferedWriter(osw);

           // 클라이언트로부터 데이터를 보내기 위해 OutputStream 선언

      

           bw.write(str);            // 클라이언트로 데이터 전송

           bw.flush();

           System.out.println("서버로 전송 성공");

       }catch(Exception e1){

           e1.printStackTrace();

           System.out.println("Data Writer Failed");

       }finally {

           try{

               bw.close();

               osw.close();

               os.close();

               sock.close();

           }catch(Exception e1){

               e1.printStackTrace();

           }

       }

}

}

public int selectCmd(String command)

{

        this.initMem();

 

        if(!this.sepCmd(command))

        return EnumValue.RETURN_INVALID;

     

        

        switch(this.argv[0])

        {

        case "quit()":

        case "Quit()":

        return EnumValue.RETURN_QUIT;

        //continue;

        case "help":

        this.cmdHELP();

                return EnumValue.RETURN_SUCCESS;

        //continue;

        case "pwd":

        this.cmdPWD();

                return EnumValue.RETURN_SUCCESS;

        //continue;

        case "cd":

        this.cmdCD();

                return EnumValue.RETURN_SUCCESS;

        //continue;

        case "connect":

        this.cmdCONNECT();

                return EnumValue.RETURN_SUCCESS;

        //continue;

        case "ls":

        case "dir":

        this.cmdLS();

                return EnumValue.RETURN_SUCCESS;

        //continue;

    case "rm":

    this.cmdRM();

           return EnumValue.RETURN_SUCCESS;

    //continue;

    case "mv":

    this.cmdMV();

           return EnumValue.RETURN_SUCCESS;

    //continue;

    case "mkdir":

    this.cmdMKDIR();

           return EnumValue.RETURN_SUCCESS;

    //continue;

    case "cp":

    this.cmdCP();

           return EnumValue.RETURN_SUCCESS;

    //continue;

    case "chmod":

    this.cmdCHMOD();

    return EnumValue.RETURN_SUCCESS;

        default:

        myPrint("\""+ command + "\" is an invalid command.");

        return EnumValue.RETURN_INVALID;

        }    

}

public Boolean sepCmd(String command)

{

argv= command.split(" ");

switch(argv[0])

{

case "cd":

if(argv.length != 2)

{

myPrint("The [" + argv[0] + "] command must have two arguments.");

myPrint("USAGE: cd [Destination Directory]");

return false;

}

break;

case "pwd":

if(argv.length != 1)

{

myPrint("The [" + argv[0] + "] command must have a single arguments.");

return false;

}

break;

case "connect":

if(argv.length != 3)

{

myPrint("The [" + argv[0] + "] command must have three arguments.");

myPrint("USAGE: connect [IP] [PORT]");

return false;

}

break;

case "ls":

case "dir":

if(argv.length != 1)

{

myPrint("The [" + argv[0] + "] command must have a single arguments.");

return false;

}

}

return true;

}

public void printINTRO()

{

myPrint("Welcome.\nThis program performs file management.\nGood luck!");

myPrint("--Type \"help\" to see a list of commands.--\n");

}

public void printENDING()

{

myPrint("Bye bye.\nThank you for using my program.");

}

public void cmdHELP()

{

myPrint("-------------------------------------");

myPrint("The command format is as follows.");

myPrint("USAGE: [Type] [Option1] [Option2] ...");

myPrint("-------------------------------------");

myPrint("The following is a list of available commands.");

myPrint("quit():: Exit the Program.");

}

public void cmdPWD()

{

myPrint("[" + this.currentPath + "]");

}

public void cmdCD()

{

String absolPath="^[a-z|A-z]:.*";

if(!Pattern.matches(absolPath, argv[1]))

{

argv[1]=this.currentPath+"\\"+argv[1];

}

 

myPrint("argv[1]: " + argv[1]);

File d = new File(argv[1]);

if(d.isDirectory())

{

try {

this.currentPath=d.getCanonicalPath();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

this.cmdPWD();

}

else

{

myPrint("[" + argv[1] + "] is the wrong path.");

}

}

public void cmdLS()

{

        File f1 = new File(this.currentPath);

        String[] list = f1.list();

        for(int i =0; i<list.length; i++)

        {

           File f2 = new File(this.currentPath, list[i]);

           if(f2.isDirectory())

           {

               System.out.printf("<DIR>: %s %n",list[i]);

           }

           else

           {

               System.out.printf("     : %s [%d byte] %n",list[i], f2.length());

           }

        }

}

/////////////////////////////////////

public void runCmdProc(String command)

{

InputStream is;

InputStreamReader isr;

BufferedReader br;

Runtime runtime=Runtime.getRuntime();

Process cmdProc;

try {

String execCmd = "cmd /c cd "+ this.currentPath + " & " + command;

myPrint(execCmd);

cmdProc = runtime.exec(execCmd);

is = cmdProc.getInputStream();

isr = new InputStreamReader(is);

       br = new BufferedReader(isr);

 

       String line;

       while((line=br.readLine())!= null)

       {

               myPrint(line);

               System.out.flush();

       }

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void cmdMV()

{

String command = "move"+" "+argv[1]+" "+"argv[2]";

this.runCmdProc(command);

}

 

public void cmdRM()

{

String command = "rd /Q" + " " + argv[1];

this.runCmdProc(command);

//rd del를 &로 같이 묶어서 실행하니 삭제가 안되서 따로 명령어 실행.

command="del" + " " + argv[1];

this.runCmdProc(command);

}

 

public void cmdCP()

{

String command = "copy"+" "+argv[1]+" "+"argv[2]";

this.runCmdProc(command);

}

public void cmdMKDIR()

{

String command = "mkdir"+" "+argv[1];

this.runCmdProc(command);

}

//////////////////////////////////

public void cmdCHMOD()

{

//모든 입력값을 서버로 전송.

this.out_stream = EnumValue.OUT_SOCKET;

}

public void cmdCONNECT()

{

if(this.myPosition == EnumValue.POSITION_SERVER)

{

System.out.println("It is available only on the client.");

return ;

}

String validIp= "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

String validPort="[0-9]{1,5}";

if (!Pattern.matches(validIp, argv[1])) 

{

  myPrint("["+ argv[1] + "] is an invalid ip.");

  return ;

}

if (!Pattern.matches(validPort, argv[2])) 

{

  myPrint("["+ argv[2] + "] is an invalid port.");

  return ;

}

MySockStream sockUtil= new MySockStream();

if(!sockUtil.clntSock(argv[1], argv[2]))

{

myPrint("Connected failed..");

return ;

}

this.shell=CommandCalc.EnumValue.SHELL_CONNECT;

this.out_stream=CommandCalc.EnumValue.OUT_SOCKET;

myPrint("Hi Server!!", sockUtil.clntSock);

this.out_stream=CommandCalc.EnumValue.OUT_CONSOLE;

   }    

}




//서버

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.Socket;

import java.util.Scanner;

import java.util.Vector;



public class FileServ {


public static void main(String[] args) {

// TODO Auto-generated method stub

ServUtil servUtil = new ServUtil();

servUtil.printINTRO();

String input = "null";

while(!input.equals("quit()") || !input.equals("Quit()"))

{

System.out.print("input:");

input = servUtil.sc.nextLine();

//메인 메뉴 선택

switch(input)

{

//사용자 정보 출력

case "1":

continue;

//서버 제어

case "2":

servUtil.servControl();

continue;

//클라이언트 제어

case "3":

continue;

case "quit()":

case "Quit()":

continue;

default:

System.out.println("["+input+"]"+"is an invalid number.");

continue;

}

}

}


}


class CntInfo

{

Socket sock;

Thread t;

}


class ServUtil

{

Scanner sc = null;

String input = null;

int servStat = 0;

int sockCount = 0;

Vector<CntInfo> cnt_list= null;

class EnumStat{

public static final int SERVICE_ON = 1;

public static final int SERVICE_OFF = 0;

}

class FileServiceRoutine implements Runnable{


int myIndex=0;

public FileServiceRoutine(int index)

{

this.myIndex = index;

}

@Override

public void run() {

// TODO Auto-generated method stub


InputStream is = null;

InputStreamReader isr = null;

BufferedReader br = null;

CntInfo cntInfo = cnt_list.get(myIndex);

System.out.print("파일 서비스중..");

while(true)

{

try {

is = cntInfo.sock.getInputStream();

isr = new InputStreamReader(is);

br = new BufferedReader(isr);

// 클라이언트로부터 데이터를 받기 위한 InputStream 선언


String data=null;

data=br.readLine();

System.out.println("["+cntInfo.sock.getInetAddress() + "]:" + data);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.print("파일 서비스를 실패하였다.");

break;

}

}

}

}

class ServiceRoutine implements Runnable{


 //  run() 메서드 오버라이딩


String port=null;

public ServiceRoutine(String port)

{

this.port= port;

}

public void run(){

   //스레드에서 실행할 작업

MySockStream mySock = new MySockStream();

if(mySock.createServSock(this.port) == false)

return ;

while(true)

{

Socket sock = mySock.accpetSock();

if(sock == null)

{

System.out.println("클라이언트 연결 실패");

continue;

}

System.out.println("["+sock.getInetAddress() + "]로 부터 연결요청이 들어옴.");

CntInfo cntInfo = new CntInfo();

cntInfo.sock=sock;

System.out.println("["+sock.getInetAddress() + "]에 대한 서비스를 시작합니다.");

//run Read

Runnable r = new FileServiceRoutine(sockCount);

Thread fileServiceRoutine = new Thread(r);

System.out.println(fileServiceRoutine);

cntInfo.t=fileServiceRoutine;

cnt_list.add(cntInfo);

sockCount++;

}

}

}

public ServUtil()

{

sc = new Scanner(System.in);

cnt_list = new Vector<CntInfo>();

}

public void printINTRO()

{

System.out.println("#Net Hard \n#서버 관리 프로그램");

System.out.println("#메뉴를 선택하세요.");

System.out.println("-----------------");

System.out.println("1.사용자 정보 관리");

System.out.println("2.서버 제어");

System.out.println("3.클라이언트 제어");

System.out.println("-----------------");

}

public void printENDING()

{

System.out.println("#Exit the program.");

System.out.println("#Thank you");

System.out.println("#Bye bye");

}

public void servControl()

{

System.out.println("-----------------");

System.out.println("#서버 제어 메뉴");

System.out.println("#서비스를 시작/중지 할 수 있습니다.");

System.out.println("-----------------");

System.out.println("1.서비스 시작");

System.out.println("2.서비스 중지");

System.out.println("3.현재 상태 출력");

System.out.println("-----------------");

System.out.print("input:");

this.input = this.sc.nextLine();

switch(input)

{

//서비스 시작.

case "1":

if(this.servStat == ServUtil.EnumStat.SERVICE_ON)

{

System.out.println("서비스가 이미 동작 중입니다.");

break;

}

this.servOn();

break;

//서비스 중지.

case "2":

if(this.servStat == ServUtil.EnumStat.SERVICE_OFF)

{

System.out.println("중지하기 위해선 먼저 서비스를 시작해야 합니다.");

break;

}

this.servOFF();

break;

//현재 상태 출력. (보류)

case "3":

break;

}

}

public void servOn()

{

//소켓을 생성하여 클라이언트와 연결한다.

Runnable r = new ServiceRoutine("9090");

Thread serviceRoutine = new Thread(r);

serviceRoutine.start();

}

public void servOFF()

{

//모든 쓰레드 종료, 소켓 해제

}

}



//MySock



import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;


class MySockStream

{

ServerSocket serverSocket = null;

 

     Socket clntSock = null;

    

    public boolean createServSock(String port)

    {

    try {

        // 리스너 소켓 생성 후 대기

        serverSocket = new ServerSocket(Integer.parseInt(port)); // socket(),bind();

        // 연결되면 통신용 소켓 생성

        if(serverSocket == null)

        {

        System.out.println("Create Error] Failed to create server socket.");

        return false;

        }

        } catch (IOException e) {

        e.printStackTrace();

        }

    return true;

    }

    

    public Socket accpetSock()

    {

    Socket acceptSock = null;

   

    try {

    // 리스너 소켓 생성 후 대기

    System.out.println("클라이언트의 연결을 기다리고 있습니다.");

    acceptSock = serverSocket.accept(); // listen(),accept();

    } catch (IOException e) {

    e.printStackTrace();

    }

   

    return acceptSock;

    }

    

Boolean clntSock(String addr, String port)

{

String[] segments = addr.split("\\.");

       String serverIp = (Long.parseLong(segments[0])

              +"."+ Long.parseLong(segments[1]) + "."

              + Long.parseLong(segments[2]) + "." +

                Long.parseLong(segments[3]));

 

       int serverPort = Integer.parseInt(port);

       

       try {

           // 서버 연결

        clntSock = new Socket(serverIp, serverPort);

           if(clntSock == null)

           {

            System.out.println("Create Error] Failed to create client socket.");

            return false;

           }

           System.out.println("You are connected to the server.");

       } catch (IOException e) {

           e.printStackTrace();

       }

       return true;

}

}

 


 

'Study > 학교수업' 카테고리의 다른 글

무선랜발표 준비  (0) 2017.05.24
웹프로그래밍] 5.16(화)  (0) 2017.05.16
무선랜] 4.27(목)  (0) 2017.04.27
웹프로그래밍] 4.18(화)  (0) 2017.04.18
CCNA] 4.12(수)  (0) 2017.04.12