스레드
채팅에서 전송 누르는 순간 getText 하고 위에서 setText 채팅창은 nullString으로 만들어줌
서버 쪽으로 메시지를 보내면 서버는 받는사람에게 그대로 보냄
나는 가만있는데 채팅에는 메세지가 계속 옴 누가 set을 계속 해주는데 뭘까? 의 취지
데몬스레드
뒤에서 보조해주는 스레드 데몬인 이유를 유추하자면 데몬을 만들게 되면 현 액티비티를 종료 시키면 데몬 또한 같이 없어져야함
만약에 본 액티비티가 죽었는데 데몬이 살아있다면 문제가 생긴다~~~
Main Thread == UI Thread
직접 건드리지말고 변경 시킬 데이터를 메세지형태로 만들기 오브젝트에 다 담으면 됨
Handler 안에 sendMessage가 존재
그래서 Handler.sendMessage(여기에 담아서 보내자message);
메세지 큐 형태로 간다 FIFO 형태
그렇다면 메세지에 변경할 데이터를 담고 한번에 한놈씩 호출하면 동기화 문제 해결됨 Looper에 담긴 후 call 하여 handler에게 보내준다?==> android
우리가 안드로이드 앱만 열면 무조건 스레드가 돌고있다
다른 앱을 열면 액티비티 스택에 있어서 하위로 들어가고 pause를 통해 결정해야한다 킬할지 말지
킬하게 되면 스레드를 또 돌게 해야됨
소켓은 접속 자체를 추상화 캡슐화
어느 ip 어느 port로 갈것인가 정함 여기서 server역할은 내가 request하지 않으면 계속 wating
socket = high level 언어이자 연결차제를 캡슐화, 추상화
생성자-상태값 세팅 어느 포트와 ip로 갈것이냐
ServerSocket = wating을 추상화,캡슐화
serverSocket(port) ip를 받지 않는 이유 클라이언트는 굳이 내 ip를 몰라도 된다
ServerSocket ss= new ServerSocket(port)
ss.accept();
return 타입 socket!!
즉 접속을 요구하면 소켓 객체를 만들어주어서 연결시킴
서버와 클라이언트가 서로 기다리거나 서로 보낼때는 deadLock 발생 교착상태 발생
보낼때 잘 받는 pingpong 을 잘 하자
(serverApp01.java)
BufferedReader fromClient =
new BufferedReader(newInputStreamReader(socket.getInputStream(),"utf-8"));
getOutputStream():값을 밖으로 보낸다
OutputStreamWriter(): 한글 형태로 보낼것 , autoflush();
PrintWriter: 한줄이 아닌 한꺼번에 보낼것
(socketClientApp)
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader(System.in): 키보드로 읽을 것
서버
client 요청 받을 준비(serverSocket) ex)7000
2.요청을 받아들임(accept)
4.보낸 data 출력(BufferedReader)
5.메세지를 보낸다(BufferedWriter)
7.종료(socker.close())
클라이언트
1.서버에 접속 요청(socket)
3.서버에 메세지를 보낸다(BufferedWriter)
6.메세지 출력(BufferedReader)
7.종료(socker.close())
01과의 차이점은 다른 client가 들어오냐 마냐의 차이인데 이것을 해결하려고
while문을 두번 씀--- 결론부터 얘기하자면 되지는 않는다
2번째 client message 출력시 error 또 but 개선점이 있다면 3초전에
첫 client 접속을 끊을 시에 server에 올라가긴한다.. 엥? 이해해야됨!!!
결론은 이 코딩 조차 multi가 되지는 않는다
== while 문안에 while 문 구조라서 첫 while문이 무한루프를 돌기 시작하면서
readLine(처음 client)에 관한것만 계속 해준다
여기서 접속을 끊게 되면 무한루프 빠져 나오면서 두번째 client의 readLine()이 가능해 지는것임
Execption의 개념은 잘 되고있다가 예외 연결을 끊는 순간 무한루프를 빠지게 되면서
그렇기 때문에 메인에 마지막 sysout이 찍히면서 두번째 클라이언트가 접속이 가능하다
그럼 어떻게 해야될까?
accept 도 계속 돌면서 메세지도 계속 주고 받는 상황을 만들고 싶다면 thread!!!!!!
하나의 스레드는 불가능 하다는게 01 02의 증거.
서버에 thread는 따로 돌면서 chatting 에 thread도 따로 돌게하는 병렬처리 코딩으로 다른 클라이언트도 접근이 가능해진다