[java] Socket & Thread를 활용하여 다중 채팅 프로그램 만들기

 

 

Socket & Thread를 활용하여 채팅 프로그램 만들기

 

 

 

소켓과 스레드를 활용하여 java로 만든 console에서만 출력되는 채팅프로그램 입니다.

기본 문법만 사용하여 만든것으로 Socket과 Tread 사용해보기 좋습니다.

 

 

서버출력

 

 

클라이언트 출력

 

 

 

 

 

 

ChatServer

package ChattingMany;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ChatServer {

    public static List<Handler> clients = new ArrayList<>();;

    public void ServerRun() {
        // 서버 소켓
        ServerSocket serverSocket;

        InputStream inputStream;
        InputStreamReader reader;
        BufferedReader br;

        OutputStream outputStream;
        PrintStream printStream;
        Scanner sc;
        try {
            // 80번 포트로 서버 실행
            serverSocket = new ServerSocket(80);
            int i=1;

            // 클라이언트가 접속하면 접속을 허용하는 코드
            // clientSocket에 클라이언트와의 연결 정보 저장
            while(true){
                Socket clientSocket = serverSocket.accept();

                // 클라이언트의 이름 읽기
                BufferedReader readerName = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String name = readerName.readLine();

                Handler chatHandler = new Handler(clientSocket, i, name);
                clients.add(chatHandler);
                chatHandler.start();

                System.out.println("New client connected: " + clientSocket.getInetAddress().getHostAddress());
                i++;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //메시지를 보낸 client를 빼고 다른 client에게 전송
    public static void broadcastMessage(String message, int idx) {
        for(int i=0; i<clients.size(); i++){
            if(clients.get(i).idx != idx)
                clients.get(i).sendMessage(message, idx);
        }
    }


    public class Handler extends Thread{
        private Socket clientSocket;

        private InputStream inputStream;
        private InputStreamReader reader;
        private BufferedReader br;

        private OutputStream outputStream;
        private PrintStream printStream;
        private Scanner sc;
        private Integer idx;
        private String name;

        Handler(Socket socket, int idx, String name) {
            this.clientSocket = socket;
            this.idx = idx;
            this.name = name;
        }

        public void run() {
            try {
                outputStream = clientSocket.getOutputStream();
                printStream = new PrintStream(outputStream);
                inputStream = clientSocket.getInputStream();

                reader = new InputStreamReader(inputStream, "UTF-8");
                br = new BufferedReader(reader);
                sc = new Scanner(System.in);

                printStream = new PrintStream(clientSocket.getOutputStream(), true);

                //client의 전체 채팅내용 저장용
                ReadThreadServer readThread = new ReadThreadServer(br, idx);
                readThread.start();

                //서버는 작성할 필요가 없음
                //WriteThread writeThread = new WriteThread(printStream,sc,name);
                //writeThread.start();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void sendMessage(String message, int idx){
            printStream.println(message);
        }
    }

    public static void main(String[] args) {
        ChatServer chatServer = new ChatServer();
        chatServer.ServerRun();
    }

}

 

 

ChatClient

package ChattingMany;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ChatClient1 {
    public static void main(String[] args) {
        Socket clientSocket;
        InputStream inputStream;
        InputStreamReader reader;
        BufferedReader br;

        OutputStream outputStream;
        PrintStream printStream;
        Scanner sc;

        String name = "배부른춘식이";

        try {
            clientSocket = new Socket("192.168.0.19", 80);
            outputStream = clientSocket.getOutputStream();
            printStream = new PrintStream(outputStream);
            inputStream = clientSocket.getInputStream();
            reader = new InputStreamReader(inputStream, "UTF-8");
            br = new BufferedReader(reader);
            sc = new Scanner(System.in);

            // 서버에 이름을 전송
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            out.println(name);

            ReadThreadClient readThread = new ReadThreadClient(br);
            readThread.start();

            WriteThread writeThread = new WriteThread(printStream,sc,name);
            writeThread.start();

            System.out.print("채팅이 시작되었습니다\n");

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

 

 

 

 


전체코드 깃허브

https://github.com/winter0123/basic-study/tree/main/src/main/java/ChattingMany

 

basic-study/src/main/java/ChattingMany at main · winter0123/basic-study

Contribute to winter0123/basic-study development by creating an account on GitHub.

github.com