JAVA - 18

Date:     Updated:

카테고리:

태그:

img

* 단톡방 만들기

Server_Client_SendThread_ReceiveThread_PerClient.java ( 서버 )

클라이언트와의 통신을 위해 ServerSocket을 사용하여 포트 9002에서 클라이언트의 연결 요청을 수락하는 서버 소켓(ss)을 생성합니다. 그리고 무한루프를 돌면서 클라이언트의 연결을 기다리고, 클라이언트가 연결되면 해당 클라이언트와 통신하기 위한 소켓(client)을 생성합니다.

Client_SendThread_ReceiveThread_PerClient.java ( 클라이언트 )

먼저, 사용자로부터 접속할 서버의 IP 주소와 채팅에 사용할 별명을 입력받습니다. 그 후, 입력받은 IP 주소와 9002 포트를 사용하여 서버에 소켓 연결을 시도합니다.

소켓 연결에 성공하면, 해당 소켓을 사용하여 서버로부터 메시지를 받는 ReceiveThread_PerClient 스레드 객체(rt)를 생성합니다. 또한, 소켓을 사용하여 다른 사용자에게 메시지를 보내는 SendThread_ReceiveThread_PerClient 스레드 객체(st)를 생성합니다.

그리고 rt 스레드와 st 스레드를 시작하여 서버와의 채팅을 시작합니다.

ReceiveThread_PerClient.java ( 메세지 수신 )

클라이언트에서 서버로부터 메시지를 받아 화면에 출력하는 ReceiveThread_PerClient 스레드 클래스입니다.

해당 클래스는 Thread 클래스를 상속받아 스레드로 동작하며, 생성자를 통해 소켓 객체를 받아 멤버 변수로 초기화합니다.

run() 메서드에서는 소켓으로부터 입력 스트림을 얻어와서 BufferedReader를 생성합니다. 그 후 무한 루프를 돌면서 입력 스트림으로부터 한 줄씩 메시지를 읽어옵니다.

만약 읽어온 메시지가 null이라면 루프를 종료하고, 그렇지 않은 경우에는 읽어온 메시지를 화면에 출력합니다.

이러한 방식으로 서버로부터 오는 메시지를 받아 클라이언트 측에서 확인할 수 있게 됩니다.

SendThread_ReceiveThread_PerClient.java ( 메세지 전송 )

해당 클래스는 Thread 클래스를 상속받아 스레드로 동작하며, 생성자를 통해 연결된 소켓 객체와 클라이언트의 닉네임을 받아 멤버 변수로 초기화합니다.

run() 메서드에서는 내가 입력한 메시지를 읽기 위해 BufferedReader를 생성합니다. 그 후 소켓으로부터 출력 스트림을 얻어와서 PrintWriter를 생성합니다.

먼저, 클라이언트의 닉네임을 서버로 전송합니다. 이후 무한 루프를 돌면서 내가 입력한 메시지를 읽어옵니다. 만약 입력된 메시지가 “bye”라면 루프를 종료하고, 그렇지 않은 경우에는 입력된 메시지를 서버로 전송합니다.

전송은 println 메서드를 사용하여 메시지를 전송하고, flush 메서드를 호출하여 출력 버퍼를 비웁니다.

메시지 전송이 완료되면 소켓을 닫고 스레드 동작을 종료합니다.

이러한 방식으로 클라이언트는 서버로 메시지를 전송할 수 있게 됩니다.

PerClient.java ( 스레드 )

이 클래스는 Thread 클래스를 상속받아 스레드로 동작하며, 각 클라이언트와 연결된 소켓을 멤버 변수로 가지고 있습니다. 또한, 해당 클라이언트와 연결된 출력 스트림(PrintWriter)을 생성하여 공유 리스트에 저장합니다.

run() 메서드에서는 연결된 클라이언트로부터 닉네임을 입력받습니다. 이후 sendAll() 메서드를 사용하여 모든 클라이언트에게 입장 메시지를 전달합니다.

그 후 무한 루프를 돌면서 클라이언트로부터 메시지를 받아옵니다. 만약 받은 메시지가 null이라면 루프를 종료합니다. 그렇지 않은 경우에는 sendAll() 메서드를 사용하여 해당 메시지를 모든 클라이언트에게 전달합니다.

메시지 전달은 공유 리스트에 저장된 모든 출력 스트림(PrintWriter) 객체를 순회하면서 메시지를 전송합니다. 각 출력 스트림에는 println() 메서드를 사용하여 메시지를 전송하고, flush() 메서드를 호출하여 출력 버퍼를 비웁니다.

스레드 동작이 종료되면 해당 클라이언트의 출력 스트림을 공유 리스트에서 제거하고, sendAll() 메서드를 사용하여 모든 클라이언트에게 퇴장 메시지를 전달합니다. 마지막으로, 소켓을 닫습니다.

결과화면 :


Image description

java 카테고리 내 다른 글 보러가기

댓글 남기기