java socket 프로그램 (Server/Client DATA 이동)에 관한 문의
안녕하세요! java를 공부 중인 왕초보 입니다.
고민을 많이 해도 안되서 고수님들 조언 / 질타 부탁드립니다.
제가 하고 싶은 것은 Server에서 보내진 Line을 Client에 파일에 저장을 하고 또한, Server에서 보내진 Line의 값에서 일정 spec을 넘으면 Server에 저장 되어 있는 file의 data를
Client로 보내는 program을 고민 중입니다.
======
Server
======
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.io.*;
import java.text.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
public class Server extends Thread{
private Socket TEST_Socket;
private ServerSocket Server_Socket;
private ServerThread Server_Thread;
public Server(){
try{
Server_Socket = new ServerSocket(7777);
}catch(IOException e){
e.printStackTrace();
}
}
public void run(){
while(true){
try{
TEST_Socket = Server_Socket.accept();
Server_Thread = new ServerThread(TEST_Socket);
// Server_Thread.start();
}catch(IOException e){
e.printStackTrace();
}finally{
try {
TEST_Socket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
new Server().start();
}
}
class ServerThread {
private PrintWriter writer;
private String data;
private RandomAccessFile raf;
private Socket TEST_Socket_Server;
public ServerThread(Socket TEST_Socket){
try{
TEST_Socket_Server = TEST_Socket;
writer = new PrintWriter(TEST_Socket_Server.getOutputStream());
String Home_Path = System.getProperty("user.home");
String Log_Name = "Server_"+currnetDate()+".log";
String Server_Log = Home_Path+File.separator+"esi"+File.separator+"log"+File.separator+Log_Name;
raf = new RandomAccessFile(Server_Log,"r");
long FileSize = raf.length()-1;
while (true) {
raf.seek(FileSize);
if (raf.readByte()=='\n') {
break;
}
FileSize--;
}
raf.seek(FileSize+1);
data = raf.readLine();
writer.println(data);
raf.close();
writer.flush();
writer.close();
TEST_Socket_Server.close();
}catch(FileNotFoundException e){
System.out.println("파일이 없습니다. ");
}catch(IOException e){
e.printStackTrace();
}finally{
try {
writer.close();
raf.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
static String currnetDate () {
Calendar cal;
cal = Calendar.getInstance();
Date date = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String currentDay = sdf.format(date);
return currentDay;
}
}
======
Client
======
import java.io.*;
import java.net.*;
import java.net.SocketException;
import java.net.ConnectException;
import java.net.Socket;
import java.util.*;
import java.text.*;
import java.io.IOException;
import java.io.FileWriter;
import java.sql.Timestamp;
public class Client {
final String logfile_path = "D:\\SEO_TEST\\log";
final String Hostfile_name = "D:\\SEO_TEST\\init\\Hostname.txt";
Socket[] Socket_Connect = null;
InputStreamReader[] StreamReader = null;
BufferedReader[] Bureader = null;
String[] Server_Data = null;
String[] Server_log_file = null;
String[] connect_Server = null;
String[] connect_Server_ipaddress = null;
String[] Server_ipaddress = null;
String[] Server_Hostname = null;
String[] Socket_Check = null;
String[][] Split_Data = null;
String LogFile_Check = null;
String Current_Date = null;
String Client_log_file = null;
public void go () {
Log_Find File_Find = new Log_Find();
Logger1 TEST_Log = new Logger1();
CurrentDay CurrentDate = new CurrentDay();
while (true) {
Current_Date = CurrentDate.currnetDate();
try {
LogFile_Check = File_Find.checkDir(logfile_path);
File pemFile = new File(Hostfile_name);
FileReader fileReader = new FileReader(pemFile);
FileReader fileReader1 = new FileReader(pemFile);
BufferedReader reader = new BufferedReader(fileReader);
BufferedReader reader_real = new BufferedReader(fileReader1);
int j = 0 ;
for (String read = reader.readLine(); read != null; read = reader.readLine()) {
j = j + 1;
}
String Read_line = null;
Split_Data = new String[j][];
Server_ipaddress = new String[j];
Server_Hostname = new String[j];
int i = 0;
while ((Read_line = reader_real.readLine()) != null) {
Split_Data[i] = Read_line.split("=");
i++;
}
for (i = 0; i < j; i++) {
Server_ipaddress[i] = Split_Data[i][1];
Server_Hostname[i] = Split_Data[i][0];
}
reader.close();
reader_real.close();
}catch(IOException ioe) {
}catch(StringIndexOutOfBoundsException sbe) {
System.out.println(sbe);
}catch (Exception e) {
e.printStackTrace();
}
for (int g = 0 ; g < Server_ipaddress.length ; g++) {
try {
Socket_Check = new String[Server_ipaddress.length];
Socket_Connect = new Socket[Server_ipaddress.length];
StreamReader = new InputStreamReader[Server_ipaddress.length];
Bureader = new BufferedReader[Server_ipaddress.length];
Server_Data = new String[Server_ipaddress.length];
connect_Server_ipaddress = new String[Server_ipaddress.length];
Client_log_file = LogFile_Check + "\\" + "Clinet" + "_" + Current_Date + ".log";
Socket_Connect[g] = new Socket (Server_ipaddress[g], 7777);
System.out.println(Socket_Connect[g]); // Test가 끝나고 적용 때 꼭 지워야 한다.
Socket_Check[g] = Socket_Connect[g].toString();
// TEST_Log.makelog(Socket_Check[g],Client_log_file);
TEST_Log.makelog(Server_Hostname[g]+" ("+Server_ipaddress[g]+")와"+" "+ " 연결이 되었습니다.",Client_log_file);
StreamReader[g] = new InputStreamReader (Socket_Connect[g].getInputStream());
Bureader[g] = new BufferedReader(StreamReader[g]);
Server_Data[g] = Bureader[g].readLine();
Bureader[g].close();
boolean connect_result = Socket_Connect[g].isConnected();
if (connect_result) {
connect_Server_ipaddress[g] = Server_ipaddress[g];
connect_Server = new String[Server_ipaddress.length];
Server_log_file = new String[Server_ipaddress.length];
if (Server_ipaddress[g].equals(connect_Server_ipaddress[g])) {
connect_Server[g] = Split_Data[g][0];
Server_log_file[g] = LogFile_Check + "\\" + connect_Server[g] + "_"+ Current_Date + ".log";
}
}
TEST_Log.makelog(Server_Data[g],Server_log_file[g]);
} catch(StringIndexOutOfBoundsException sbe) {
System.out.println(sbe);
} catch(ConnectException ce) {
String Exception_check = Server_Hostname[g]+" ("+Server_ipaddress[g]+")와"+" "+ "연결이 되지 않앗습니다. (Connection Fail)"+" "+Server_Hostname[g]+" 확인 필요";
TEST_Log.makelog(Exception_check,Client_log_file);
} catch(FileNotFoundException fne) {
System.out.println(fne);
} catch(IOException ioe) {
} catch (Exception e) {
e.printStackTrace();
}
} // for문의 끝
} // while문
} // go method
public static void main(String args[]) {
Client Objcet = new Client();
Objcet.go();
}
} // Client Main Class end
class Log_Find
{
public String checkDir(String FilePath) {
String bResult = null;
File DSM_dir = new File(FilePath.trim());
File DSM_dir_log = new File(FilePath.trim()+"\\log");
if (DSM_dir.isDirectory()) //폴더 및 파일 존재시 true반환
if (DSM_dir_log.isDirectory()) {
bResult = DSM_dir_log.getPath();
} else {
DSM_dir_log.mkdir();
bResult = DSM_dir_log.getPath();
}
else {
DSM_dir.mkdir();
DSM_dir_log.mkdir();
bResult = DSM_dir_log.getPath();
}
bResult=DSM_dir_log.getPath();
return bResult;
}
//폴더 리스트 함수
}
class CurrentDay
{ // 현재 날짜를 구해주는 Class
public String currnetDate () {
Calendar cal;
cal = Calendar.getInstance();
Date date = cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");
String currentDay = sdf.format(date);
return currentDay;
}
}
class Logger1
{
public static void makelog(String log, String LogFile) {
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
String today = null;
today = formatter.format(cal.getTime());
Timestamp ts = Timestamp.valueOf(today);
String str = "[" +today + "]"+" ";
log = str + log;
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(LogFile, true));
bw.write(log);
bw.newLine();
bw.close();
} catch(IOException ie) {
System.err.println("Error");
System.exit(1);
}
}
}
위와 같이 Server/Client를 구성을 하면 Server에서 첫번째 가지고 오는 line은 Client에 파일로 제대로 찍히는 데요.
위에서 설명을 했듯이 Server에서 Client로 보내는 line을 가지고 값이 spec을 넘어 서면 server의 파일을 client로 보내는 부분을 해야 하는데, 어떤 방법을 써도 안되네요.
고수님들의 조언 / 질타 부탁드립니다. (참고 : line의 값은 "47 39 1"이고요 첫번째 값인 47이 일정 spec을 넘으면 server의 파일의 data를 client 보내고 싶습니다.)
저의 무지로 머리에 스팀이 장난이 아니네요. 저에게는 중요한 부분이라, 고수님들의 조언 부탁드립니다.
그럼 즐거운 하루 되세요.
댓글 달기