메모장 입니다2
자바] 5.10 본문
//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 |