본문 바로가기
안드로이드 자바

[Java][Android] JAVA 1대 1 콘솔 채팅 (server 구현하기)

by teamnova 2022. 3. 22.
728x90

오늘부터 저희는 매주 JAVA로 채팅하는 방법에 대해 차근차근 알아보겠습니다.

 

우선 이에 앞서 TCP 통신에 대한 기초적인 이해가 수반되어야 합니다.

 

그럼 바로 시작하겠습니다.

 

저는 intellij 자바로 작업을 하였습니다.

 

우선 서버측 소스코드를 오늘 알아보겠습니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
 
public class TCPServer {
 
    public static final int PORT = 6077;
 
    public static void main(String[] args) {
 
        ServerSocket serverSocket = null;
 
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
 
        OutputStream os = null;
        OutputStreamWriter osw = null;
        PrintWriter pw = null;
        Scanner sc = new Scanner(System.in);
 
        try {
            // 1. Server Socket 생성
            serverSocket = new ServerSocket();
            // 2.Binding : Socket에 SocketAddress(IpAddress + Port) 바인딩 함
            InetAddress inetAddress = InetAddress.getLocalHost();
            String localhost = inetAddress.getHostAddress();
            serverSocket.bind(new InetSocketAddress(localhost, PORT));
            System.out.println("[server] binding " + localhost);
            // 3. accept(클라이언트로 부터 연결요청을 기다림)
            Socket socket = serverSocket.accept();
            InetSocketAddress socketAddress = (InetSocketAddress) socket.getRemoteSocketAddress()
 
            System.out.println("[server] connected by client");
            System.out.println("[server] Connect with " + socketAddress.getHostString() + " " + socket.getPort());
            while (true) {
                // inputStream 가져와서 (주 스트림) StreamReader와 BufferedReader로 감싸준다 (보조 스트림)
                is = socket.getInputStream();
                isr = new InputStreamReader(is, "UTF-8");
                br = new BufferedReader(isr);
                // outputStream 가져와서 (주 스트림) StreamWriter와 PrintWriter로 감싸준다 (보조 스트림)
                os = socket.getOutputStream();
                osw = new OutputStreamWriter(os, "UTF-8");
                pw = new PrintWriter(osw, true);
                String buffer = null;
                buffer = br.readLine(); // Blocking
                if (buffer == null) {
                    // 정상종료 : remote socket close()
                    // 메소드를 통해서 정상적으로 소켓을 닫은 경우
                    System.out.println("[server] closed by client");
                    break;
                }
                System.out.println("[server] recived : " + buffer);
                pw.println(buffer);
            }
            // 3.accept(클라이언트로 부터 연결요청을 기다림)
            // .. blocking 되면서 기다리는중, connect가 들어오면 block이 풀림
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (serverSocket != null && !serverSocket.isClosed())
                    serverSocket.close();
 
            } catch (Exception e) {
                e.printStackTrace();
            }
            sc.close();
        }
    }
}

주석을 통해 설명을 달아놨습니다.

 

우선 상단에 port는 임의로 설정해주시면 됩니다.

그리고 저는 서버를 localhost 즉, 제 컴퓨터 와이파이 공유기의 주소로 설정 해주었습니다.

 

다음시간에는 client쪽 소스를 알아보겠습니다.

 

https://stickode.com/mainlogin.html

 

STICKODE

 

stickode.com