Sinbum's blog
  • 인셉션 개발자
    • History
    • Editorial Board
    • 세미나
      • MS_빅데이터_분석_교육
      • Databricks_Musinsa_사례분석
      • Databricks_AMOREPACIFIC_사례분석
    • 개발자 꿀팁
  • 리눅스
    • 리눅스 기초
      • 기본명령어
      • 프록시서버
      • 온프레미스
      • systemd
      • 우분투 앱
      • vi 사용법
    • 도커
      • MSA 아키텍처
      • 도커 설명
      • 도커 설치
      • 도커 가이드
        • 컨테이너 만들기
        • 컨테이너 보관
        • 컨테이너 사용
        • 컨테이너 관리
        • 컨테이너 볼륨
        • 컨테이너 통신
        • 도커 연습
  • 언어
    • 자바
      • 자바(JAVA)는 무엇인가?
        • JVM 메모리
      • 자바 설치 가이드
      • 자바 언어 활용
        • 변수
        • static
        • 상수
        • 연산자
        • 제어문
        • 배열
        • CLI-자바사용
        • 클래스
        • 메소드
        • 값에의한 호출
        • GUI 프레임
        • 생성자
        • 오버로딩
        • 상속
        • 상속생성자
        • 접근제한자 와 가비지 컬렉션
        • 추상클래스 와 인터페이스
        • 다중구현
        • 예외처리
        • 컬렉션 프레임워크
        • 쓰레드
        • 네트워크
        • 다중 접속 서버 구현
      • 간단한 채팅 앱 개발하기
    • 파이썬
      • 파이썬(Python)은 무엇인가?
      • 파이썬 설치 가이드
      • 파이썬 언어 활용
        • 변수
        • 입력,출력
        • 타입선언
        • 자료구조
        • 주석처리
        • 문자열
        • 리스트
        • 반복문
        • 연산자
        • 조건문
        • 정규표현식
          • re 모듈
          • 메타문자1
          • 메타문자2
          • 그루핑
          • 전방탐색
          • 문자열 바꾸기
          • Greedy 와 Non-Greedy
      • 마치며...
  • 형상관리,CI/CD
    • 깃허브
      • 깃허브 협업 모델
      • 깃허브 설치 와 ssl
      • 깃허브를 잘쓰는 팁 모음
  • BigData
    • BigData 개념
      • OLTP,OLAP
      • ELT,ETL
      • DW
      • ObjectStorage
      • LambdaArc
      • OGG
    • Kafka
      • 환경설정 및 소스코드 다운로드
      • 아파치 카프카는?
        • 카프카의 시작
        • 카프카 특성
        • 빅데이터 아키텍처
      • 카프카 기초 개념
    • BuildApplications
      • Airflow
      • Grafana
    • PowerBi
      • DAX
        • REMOVEFILTERS
        • DAX_문법
        • DAX_함수
    • Azure
      • SynapseAnalytics
  • IOT
    • 아두이노
      • 설치 및 기초
      • 센서의 종류
      • led 출력하기
      • 시리얼 통신
      • 무선 통신
  • About
    • SINBUM
    • INTEREST
    • PROJECTS
      • 업무 프로젝트
      • 개인 프로젝트
        • 티스토리API를 사용한 블로그 앱
        • 노션 API와 블로그 연동 자동화 하기
        • 로지텍 마우스 수리
    • CONTACT
Powered by GitBook
On this page
  • Thread 기반의 채팅 서버/클라이언트 만들기
  • 채팅 서버 생성
  • 채팅 클라 생성
  • 실행 하기
  • 멀티 채팅 앱 구현하기.
  • 멀티 채팅 서버 생성
  • 멀티 채팅 클라 생성
  • 실행 하기
  1. 언어
  2. 자바

간단한 채팅 앱 개발하기

Thread 기반의 채팅 서버/클라이언트 만들기

채팅 서버 생성

ChatServerThread.java

package chatting;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServerThread {

    private Socket socket=null;
    private ServerSocket server = null;
    int connectCount=0;

    public void serverStart(){
        System.out.println("접속자를 기다리는 중입니다.");
        try {
            server = new ServerSocket(2022);
            socket = server.accept();
            
            InetAddress ia = socket.getInetAddress();
            int port = socket.getLocalPort();// 접속에 사용된 PORT 
            String ip = ia.getHostAddress(); // 원격 Client IP 
            
            ++connectCount;  //접속자수 카운트
            System.out.print(connectCount);
            System.out.print("클라이언트 접속-Local Port: "+ port);
            System.out.println(" Client IP: " + ip);
            
            //데이터를 읽어오는 스레드
            ChatServerReadHandler read = new ChatServerReadHandler(socket);
            read.start();
            //데이터를 보내는 스레드
            ChatServerSendHandlersend = new ChatServerSendHandler(socket);
            send.start();
        } catch(IOException ioe) {
            System.err.println("연결이 되어 있지 않습니다.");
        } finally {
            try {
                server.close();
            } catch(IOException ignored) {}
        }
        
    }

    public static void main(String[] args) {
        ChatServerThread cs = new ChatServerThread();
        cs.serverStart();
    }
}

ChatServerReadHandler.java

  • 데이터를 읽어오는 ReadHandler 생성

class ChatServerReadHandler extends Thread{
private Socket socket;
private String line;   //서버로부터 읽어온 문자열 저장

    public ChatServerReadHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatServerReadHandler(Socket socket) {
        this.socket = socket;  
    }

    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true){
                line = reader.readLine();
                
                if (line == null){ 
                    break;
                }
                System.out.println("받은글: " + line);
                System.out.print("☞ ");
            }

        } catch(IOException ignored) {
        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}
  • 데이터를 보내는 SendHandler 생성

ChatServerSendHandler.java

class ChatServerSendHandler extends Thread{
private Socket socket;
private BufferedWriter writer;
private BufferedReader in;           
private String s="";

    public ChatServerSendHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatServerSendHandler(Socket socket) {
        this.socket = socket;
        try{
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            in = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            System.err.println("연결이 되어 있지 않습니다.");
        }   
    }

    public void run() {
        try {
            while(true) {
                System.out.print("☞ ");
                s = in.readLine(); //키보드로부터 입력
                if(s.equals("999")){
                    break; //종료코드
                }
                writer.write(s);
                writer.newLine();  //줄바뀜 기호가 있어야 BufferedReader의 readLine()이 인식함
                writer.flush();    //client로 전송 

                //System.out.println("보낸 글:" + s);//입력받은 내용 출력
            }
        } catch(Exception ignored) {

        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}

채팅 클라 생성

ChatClientThread.java

package chatting;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ChatClientThread {
private Socket socket = null;

    public void clientStart(String ip){
        System.out.println("클라이언트 프로그램 작동.....");
        try {
            socket = new Socket(ip, 2022);
            
            InetAddress ia = socket.getInetAddress();
            int local_port = socket.getLocalPort();// 접속에 사용된 PORT
            int server_port = socket.getPort();// 접속에 사용된 PORT
            String server_ip = ia.getHostAddress(); // 원격 Client IP 
            
            System.out.print("클라이언트 접속-Local Port: "+ local_port);
            System.out.print(" Server IP: " + server_ip);
            System.out.println(" Server PORT: " + server_port);            
            
            //데이터를 읽어오는 스레드
            ChatClientReadHandler read = new ChatClientReadHandler(socket);
            read.start();
            //데이터를 보내는 스레드
            ChatClientSendHandler send = new ChatClientSendHandler(socket);
            send.start();
            
        } catch(IOException ioe) {
            System.err.println("연결이 되어 있지 않습니다.");
        } finally {
            try {
                if(socket == null){
                    socket.close();                    
                }
            } catch(IOException ignored) {}
        }
       
    }

    public static void main(String[] args) {
        ChatClientThread cc = new ChatClientThread();
        cc.clientStart(args[0]);
    }
}
  • 데이터를 읽어오는 클라이언트 ReadHandler 생성

class ChatClientReadHandler extends Thread{
private Socket socket;
private String line;   //서버로부터 읽어온 문자열 저장

    public ChatClientReadHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatClientReadHandler(Socket socket) {
        this.socket = socket;  
    }

    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true){
                line = reader.readLine();
                
                if (line == null){ 
                    break;
                }
                
                System.out.println("받은글: " + line);
                System.out.print("☞ ");
            }
        } catch(IOException ignored) {
            System.err.println("연결이 되어 있지 않습니다.");
        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}
  • 데이터를 보내는 클라이언트 SendHandler 생성

class ChatClientSendHandler extends Thread{
private Socket socket;
private BufferedWriter writer;
private BufferedReader in;           
private String s="";

    public ChatClientSendHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatClientSendHandler(Socket socket) {
        this.socket = socket;
        try{
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            in = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            System.err.println("연결이 되어 있지 않습니다.");
        }   
    }

    public void run() {
        try {
            while(true) {
                System.out.print("☞ ");
                s = in.readLine(); //키보드로부터 입력
                if(s.equals("999")){
                    break; //종료코드
                }
                writer.write(s);
                writer.newLine();  //줄바뀜 기호가 있어야 BufferedReader의 readLine()이 인식함
                writer.flush();
                //System.out.println("보낸 글:" + s);//입력받은 내용 출력
            }
        } catch(Exception ignored) {

        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}

실행 하기

  • CMD 를 실행합니다.

C:
cd F:\ChatServerThread 클래스가 있는 폴더경로.
start java chatting.ChatServerThread

start java chatting.ChatClientThread 172.16.3.1

멀티 채팅 앱 구현하기.

멀티 채팅 서버 생성

ChatServerThreadMulti.java

package multichatting;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

public class ChatServerThreadMulti {

    private Socket socket=null;
    private ServerSocket server = null;
    private Vector user=null;
    int connectCount=0;

    public ChatServerThreadMulti(){
        user = new Vector(20);
    }
    
    public void serverStart(){
        System.out.println("**************************************");
        System.out.println("***** 접속자를 기다리는 중입니다. *****");
        System.out.println("**************************************");
        try {
            server = new ServerSocket(2022);
            while(true){
                socket = server.accept(); //Lock
                
                InetAddress ia = socket.getInetAddress();
                int port = socket.getLocalPort();// 접속에 사용된 PORT 
                String client_ip = ia.getHostAddress(); // 원격 Client IP
                int client_port = socket.getPort();// 원격 Client PORT
                
                ++connectCount;  //접속자수 카운트
                System.out.print(connectCount);
                System.out.print("클라이언트 접속-Local Port: "+ port);
                System.out.print(" Client IP: " + client_ip);
                System.out.println(" Client PORT: " + client_port);
                
                
                //null인 Socket 객체를 Vector에서 제거합니다.
                try{
                    for(int i=0; i< user.size(); i++){
                        Socket s = (Socket)user.get(i);
                        if (s==null){
                            user.remove(i);
                            user.trimToSize();
                        }
                    }
                }catch(Exception e){
                    System.out.println(e.toString());
                }
                user.add(socket);
            
                //데이터를 읽어오는 스레드
                ChatServerReadHandler read = new ChatServerReadHandler(user, socket);
                read.start();
                //데이터를 보내는 스레드
                //ChatServerSendHandler send = new ChatServerSendHandler(user);
                //send.start();
            }
        } catch(Exception e) {
            System.err.println(e.toString());
        } finally {
            try {
                server.close();
            } catch(IOException ignored) {}
        }
        
    }

    public static void main(String[] args) {
        ChatServerThreadMulti cs = new ChatServerThreadMulti();
        cs.serverStart();
    }
}
  • ReadHandler 생성

ChatServerReadHandler.java

class ChatServerReadHandler extends Thread{
private Vector user;
private Socket socket;
private String line;   //서버로부터 읽어온 문자열 저장
private BufferedWriter writer; // 네트워크 전송

    public ChatServerReadHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatServerReadHandler(Vector user, Socket socket) {
        this.user = user;
        this.socket = socket;
    }

    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true){
                line = reader.readLine();
                
                for(int i=0; i< user.size(); i++){
                    Socket s = (Socket)user.get(i);
                    if(s.isClosed()){
                        user.remove(i);
                        user.trimToSize();
                    }else{
                        writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                        writer.write(line);
                        writer.newLine();  //줄바뀜 기호가 있어야 BufferedReader의 readLine()이 인식함
                        writer.flush();
                    }
                }                
                System.out.println(line);
                System.out.println("현재 접속자수: " + user.size());
                //System.out.print("☞ ");
                if (line == null) {
                    break;
                }
            }

        } catch(IOException ignored) {
        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}

멀티 채팅 클라 생성

ChatClientThreadMulti.java

package multichatting;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ChatClientThreadMulti {
private Socket socket = null;

    public void clientStart(String ip, String id){
        System.out.println("클라이언트 프로그램 작동.....");
        try {
            socket = new Socket(ip, 2022);
            
            InetAddress ia = socket.getInetAddress();
            int local_port = socket.getLocalPort();// 접속에 사용된 PORT
            int server_port = socket.getPort();// 접속에 사용된 PORT
            String server_ip = ia.getHostAddress(); // 원격 Client IP 
            
            System.out.print("클라이언트 접속-Local Port: "+ local_port);
            System.out.print(" Server IP: " + server_ip);
            System.out.println(" Server PORT: " + server_port);            
            
            //Server와 통신할 스레드 구현 클래스
            ChatClientReadHandler read = new ChatClientReadHandler(socket, id);
            read.start();
            ChatClientSendHandler send = new ChatClientSendHandler(socket, id);
            send.start();
            
        } catch(IOException e) {
            System.err.println(e.toString());
        } finally {
            try {
                if(socket == null){
                    socket.close();                    
                }
            } catch(IOException ignored) {}
        }
       
    }

    public static void main(String[] args) {
        ChatClientThreadMulti cc = new ChatClientThreadMulti();
        cc.clientStart(args[0], args[1]);
    }
}
  • 클라이언트 ReadHandler 생성

ChatClientReadHandler.java

class ChatClientReadHandler extends Thread{
private Socket socket;
private String line;   //서버로부터 읽어온 문자열 저장
private String id;     //대화명

    public ChatClientReadHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatClientReadHandler(Socket socket, String id) {
        this.socket = socket;  
        this.id = id;
    }

    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true){
                line = reader.readLine();
                if (line == null) {
                    break;
                }
                System.out.println(line);
            }
        } catch(Exception e) {
            System.err.println(e.toString());
        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}
  • 클라이언트 SendHandler 생성

ChatClientSendHandler.java

class ChatClientSendHandler extends Thread{
private Socket socket;
private BufferedWriter writer;
private BufferedReader in;           
private String s;
private String id;

    public ChatClientSendHandler() {
        System.out.println("프로그램이 초기화 되지 않았습니다.");
    }
    
    public ChatClientSendHandler(Socket socket, String id) {
        this.socket = socket;
        this.id = id;
        try{
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            in = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            System.err.println(e.toString());
        }   
    }

    public void run() {
        try {
            while(true) {
                try {
                  //System.out.print(id + ": ");
                  s = in.readLine(); //키보드로부터 입력
                  if(s.equals("999")){
                      break; //종료코드
                  }
                  writer.write(id + ": " + s);
                  writer.newLine();  //줄바뀜 기호가 있어야 BufferedReader의 readLine()이 인식함
                  writer.flush();
                } catch (Exception e) {
                }    
            }
        } catch(Exception ignored) {

        } finally {
            try {
                socket.close();
            } catch(IOException ignored) {}
        }
    }

}

실행 하기

실행:
C:
cd C:\ChatServerThreadMulti 자바 파일 경로
start java multichatting.ChatServerThreadMulti
start java multichatting.ChatClientThreadMulti {ip 주소} {아이디}
Previous다중 접속 서버 구현Next파이썬

Last updated 2 years ago