개발 공부/Java

자바 프로젝트 - 11/17 - 11/22

징_ 2023. 11. 21. 12:22


1. 서버 앱에서 하는 일   

 a. 프로그램 실행 시 초기화
i. 기존 저장된 클라이언트 정보(IP주소 + 이름) / 대화내용(UNIX 타임스탬프 + 대화내용) 불러오기
ii. CSV 파일에 저장된 내용을 HashMap으로 load
iii. 클라이언트가 채팅 쏘면? Chat.csv 파일에 행 추가 + HashMap chatMap 에다 +1


 b. 클라이언트 통신 준비
ii. TCP/IP 포트 개방 + 클라이언트로부터 접속 요청을 받기 위한 준비
iii. 클라이언트 접속되면: (이름)님 반갑습니다. + 이전 대화 내용 전송


c. 클라이언트가 채팅을 보내면?
i. 수신 -> CSV 파일 저장 + 클라이언트에게 보여주기



2. 클라이언트 앱에서 하는 일 

a. 서버에게 접속 요청
b. 채팅 내용 작성할 수 있는 칸 + 보내기 버튼 (Enter)

c. 서버로부터 전송받은 기존 대화내용을 보여주기 => ? 

 


프론트엔드 : 사용자가 보는 화면
GUI : Graphic User Interface
CUI : Character User Interface

 

 

*소캣 구현하는 방법

1) 서버소켓 생성

    ServerSocket serverSocket = new ServerSocket(8000);  // 포트번호

 

2) 클라이언트 접속 대기

    Socket socket = serverSocket.accept( );

 

3) 데이터 송수신을 위한 input/output 스트림 생성 

    InputStream in = socket.getInputStream( );

    OutputStream out = socket.getOutputStream( );

 

4) input 스트림을 통한 데이터 수신 (클라이언트 → 서버)

    byte[ ] inputData = new byte[100];

    int length = in.read(inputData);

    String inputMessage = new String(inputData, 0, length);

 

5) output 스트림을 통한 데이터 송신 (서버 → 클라이언트) 

    String outputMessage = "보낼메시지";

    out.write(outputMessage.getBytes( ));

    out.flush( );

 

6) 통신 종료

    socket.close( );

    serverSocket.close( );

 

*소캣 생성자

 

*ServerSocket - 포트번호를 매개변수로 받음

public ServerSocket(int port) throws IOException {

this(port, 50, null);

}

 

 

*Socket - IP주소와 포트번호를 매개변수로 받음

 

public Socket(String host, int port)

throws UnknownHostException, IOException

{

this(host != null ? new InetSocketAddress(host, port) :

new InetSocketAddress(InetAddress.getByName(null), port),

(SocketAddress) null, true);

}

 

 

 

● CSVReader 클래스를 이용한 파일 입출력

- HashMap은 휘발성 메모리인 RAM에 데이터가 저장되므로 
서버 앱 종료 시 기존 데이터가 삭제됨 

=> 기존 데이터 삭제 안되려면 filewriter에 true


- 실시간으로 CSV 파일에도 해당 내용을 추가하고, 서버 앱 
종료 후 재실행 시에는 저장된 Chat.csv / User.csv 파일의 
내용을 불러와 HashMap에 다시 데이터를 넣을 것

 


*실시간 csv 파일에 해당 내용 추가

- User.csv : 구현 ㅇ 
- Chat.csv : fw.write(userName)막힘 -> 구현 ㅇ
=> 반복자 안써서 그럼

+)문제점 추가
- 불필요한 대화내용(예를들면 시스템, 서버에서 전송된 대화)
파일에 저장 안하고 싶음 
=> 시스템, 서버 대화 전송 메서드에 addChat(Chat)뺌


-대화 내용이 뒤죽박죽으로 csv파일에 저장됨
=> 시간 문제인줄 알고 시간메서드 dateTime 이거씀 
근데 이게 더 파일 확인에 좋은거 같음


=> HashMap 선언부분에 LinkedHashMap사용하면 
데이터 입력순으로 파일 저장됨

 

-fw.write(IP주소, 닉네임) 이런식으로 넣어줬더니 이어쓰기 가능할때 (true)자꾸 매번 추가됨

=> 그냥 빼버리고 기존 csv파일에 직접 넣어줌


*서버앱 종료 후 재실행 시에는 저장된 파일의 내용 불러와
HashMap에 다시 데이터 넣기
(이전 대화목록 보여주기)

//이거는 나중에 혼자 따로 해보기.. HashMap에 저장되기에는 3개임

시간, 닉네임, 대화내용

2023-11-21 12:57:39, 노랑오이, 안녕하세요

2023-11-21 12:57:39, 노랑오이, 저는

2023-11-21 12:57:41, 노랑오이, 노랑오이

2023-11-21 12:58:03, 초록오이, 안녕하세요

2023-11-21 12:58:03, 초록오이, 저는

2023-11-21 12:58:05, 초록오이, 초록오이

=> 배열로 만들기 

시간배열 

닉네임배열

대화내용배열

 

+)문제점 추가

- 대화내용에 , 들어갈때 콤마 기준으로 칸 나눠짐

=> 보통 csv파일은 ,(콤마)로 구분하는데 

내용안에 ,(콤마)가 포함되어 있을 경우 

"바나나, 사과" 처럼 ""(더블퀀트)로 감싸서 이스케이프 처리를 할 수 있다.

즉 바나나,사과 문자열이 하나의 셀에 들어간다.

 

- 서버앱 종료 구현 : ㅇ


- 저장된 파일 HashMap에 다시 넣어서 이전 대화목록 꺼내기

1. cvs 파일을 불러온다. 

2. 해쉬맵의 키와 밸류에 넣을 매개변수를 csvReader에서 지정해준다. 

3. 해쉬맵에서 키를 불러와 밸류값을 반환..? 하면 이전 대화목록이 뜬다.

 

 

*continue와 break의 차이

- continue : 특정 조건 수행하지 않고 스킵하기

- break : 반복문에서 반복문을 빠져 나올때


*StringBuilder

StringBuilder는 자바에서 문자열을 생성하고 조작하는 데 사용되는 클래스입니다.

다음은 StringBuilder의 주요 특징입니다.

  1. 문자열 생성 및 조작

StringBuilder는 문자열을 생성하고 조작하는 데 사용됩니다. 예를 들어, 문자열을 추가하거나, 문자열을 수정하는 등의 작업을 할 수 있습니다.

  1. 빠른 속도

StringBuilder는 문자열을 생성하고 조작하는 데 빠른 속도를 제공합니다. 이는 StringBuilder가 내부적으로 메모리를 효율적으로 관리하기 때문입니다.

  1. 동기화 지원

StringBuilder는 동기화를 지원합니다. 이는 여러 스레드에서 StringBuilder를 동시에 사용할 때 발생할 수 있는 문제를 예방할 수 있습니다.

다음은 StringBuilder의 주요 메서드입니다.

  1.  append(): 문자열을 추가합니다.
  2.  delete(): 문자열을 삭제합니다.
  3.  insert(): 문자열을 삽입합니다.
  4.  replace(): 문자열을 대체합니다.
  5.  reverse(): 문자열을 역순으로 뒤집습니다.
  6.  toString(): 문자열을 반환합니다.

 

*할일

- 대화내용 콤마 있을 때

- 아이피 주소 같을 때 같은 닉네임