자바 프로젝트 - 11/17 - 11/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의 주요 특징입니다.
- 문자열 생성 및 조작
StringBuilder는 문자열을 생성하고 조작하는 데 사용됩니다. 예를 들어, 문자열을 추가하거나, 문자열을 수정하는 등의 작업을 할 수 있습니다.
- 빠른 속도
StringBuilder는 문자열을 생성하고 조작하는 데 빠른 속도를 제공합니다. 이는 StringBuilder가 내부적으로 메모리를 효율적으로 관리하기 때문입니다.
- 동기화 지원
StringBuilder는 동기화를 지원합니다. 이는 여러 스레드에서 StringBuilder를 동시에 사용할 때 발생할 수 있는 문제를 예방할 수 있습니다.
다음은 StringBuilder의 주요 메서드입니다.
- append(): 문자열을 추가합니다.
- delete(): 문자열을 삭제합니다.
- insert(): 문자열을 삽입합니다.
- replace(): 문자열을 대체합니다.
- reverse(): 문자열을 역순으로 뒤집습니다.
- toString(): 문자열을 반환합니다.
*할일
- 대화내용 콤마 있을 때
- 아이피 주소 같을 때 같은 닉네임