1. 명령프롬프트에서 컴파일과 실행 동시에 하기
javac -encoding UTF-8 ClassName.java && java ClassName
UTF-8로 인코딩하는 방법을 검색하다가 위와 같은 명령어를 발견.
두 줄에 나눠 쓸 것을 && 를 사용해 이어붙여서 한 문장으로 사용 가능.
EditPlus에서 Eclipse로 갈아탄지 좀 됐지만 이걸 이제 알았다니 크흠..
2. 네트워크 Socket 연습
채팅 구현 방식이 나의 상상과 약간 다른 부분이 있었다.
입력을 하면 내 화면엔 내 입력값이 들어가고 해당 입력값을
서버와 동기화(?)해주는 방식으로 진행되는 줄 알았는데
나의 입력마저도 서버로 갔다가 서버에서 전달해주는 값을 리턴하는 것이었다.
물론 이게 현재 TCP 동기 방식으로 진행하기 때문인지 까지는 모르겠다.
1) 스스로 서버와 클라이언트 모두 구현하기
서버측은 ServerSocket 클래스의 객체를 생성하고
해당객체의 accept 메소드를 이용해 Socket 클래스의 객체를 초기화한다.
클라이언트측은 Socket 클래스에 서버의 IP와 포트를 입력하여 객체를 생성한다.
양측은 BufferedReader/Writer , OutputStreamWriter/InputStreamReader,
그리고 Socket클래스의 getOutputStream/getInputStream 메소드로 송수신한다.
송수신 메소드를 따로 준비한다.
while (true)로 계속 반복을 진행시키고
BufferedReader 객체의 readLine메소드로 스트링을 얻어온다.
split 메소드와 구분자를 이용해 입장, 채팅, 퇴장을 구분해서 처리한다.
OutputStreamWriter를 사용할 경우엔 주의사항이 있다.
readLine()의 특성과 연결되는 지점인데,
OutputStreamWriter의 객체의 write() 메소드 사용시, "\n"을 추가해 줄을 구분해야 한다.
또한 write 메소드 사용 후 flush 메소드를 사용해 버퍼를 정리해줘야 한다.
단, PrintWriter의 println 메소드를 사용하면 "\n"을 추가하지 않아도 된다.
flush는 동일하게 해줘야 한다.
소켓과, 서버소켓, 리더 라이터의 객체는 사용이 종료된 후 close해준다.
2) 강사님의 서버에 내가 클라이언트로 접속하기
액션리스너를 필요한 컴포넌트마다 익명클래스로 따로 잡아주는 게 깔끔해보이고 재밌어서
계속 그렇게 해왔는데.. 오늘 잠시 난관에 부딪혔다.
채팅값을 입력하는 JTextField에서 Enter 키 입력시 액션을 줘야 하고
JTextField 오른쪽의 JButton 보내기를 통해서도 액션을 줘야하는 상황이었다.
액션 발생 지점은 2개고 기능은 동일했다.
그래서 implement ActionListener를 해서 한 곳에 한 번만 작성하면 되는 것이었다.
내가 당한 문제는 JTextField에 액션리스너를 줄 순 있는데
"Enter키가 눌렸을 때" 이것을 설정하는 법을 몰랐다.
이거는 아마 찾으면 찾을 수 있지 않을까 싶다.
2020. 05. 05 추가
JButton 에도 버튼이 눌렸을 때 라는 조건은 없다.
버튼 자체에 액션 주면 그만이다.
JTextField도 1줄 입력용이기 때문에
엔터를 눌렀을 때 라는 조건은 필요 없이
JTextField에 액션 주면 그만인 것으로 이해함.
-추가 끝-
문제가 해결된 건 놀랍게도.... JTextField에 액션 리스너를 할당하면
버튼이 눌렸을 때와 마찬가지로 Enter를 입력했을때 액션을 알아먹는다는 것이었다.
그리고.. 액션을 먹일 대상이 많아지면 결국 쪼개지는게 편하지 않을까 하는 생각과
지금은 2개밖에 없는데 그냥 implement가 익명클래스보다 나은거 아닌가 하는 생각이었다.
강사님의 서버단을 보거나 배우지 않아서 아직 잘 모르겠지만...
접속하고자 하는 소켓마다 서버측에서도 동일한수의 소켓을 생성해서 대응해야 하는 방식이라고 배웠다.
네트워크는 아직 공부가 아주 많이 부족하다 크허...
3. 미니프로젝트 팀 구성 완료
5명 조가 됐다.
캐치마인드를 주제로 정했다.
스케치한 후 강사님 피드백을 받았다.
'Java & Spring' 카테고리의 다른 글
2020.05.07 (목) 학습 : 그림판 더블버퍼링, jSmooth (0) | 2020.05.07 |
---|---|
2020.05.06 (수) 학습 : 네트워크, 채팅, 서버 클라이언트 (0) | 2020.05.07 |
2020.05.01 (금) 학습 : 네트워크, EOFException, Interface (0) | 2020.05.01 |
2020.04.29 (수) 학습 : 직렬화 Serializable, Graphics2D, GUI (0) | 2020.04.29 |
2020.04.28 (화) 학습요약 : 자바 타이머, 자바 메모장 (0) | 2020.04.29 |