자바 소켓 프로그래밍으로 채팅 프로그램을 만드는데 스레드로 문자열을 어떻게 전송하나요?

조회수 690회

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;

public class Server { private ServerSocket serverSocket = null; private Socket socket = null; private BufferedReader in = null; private BufferedWriter out = null; private Scanner sc = new Scanner(System.in);

public Server() {

    try {
        System.out.println("연결 대기중");
        serverSocket = new ServerSocket(9999);
        socket = serverSocket.accept();
        System.out.println("연결 완료");

        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        // Server가 입력한 문자열
        String serverMessage = null;
        while (true) {
            System.out.print("서버: ");
            serverMessage = sc.nextLine();
            out.write(serverMessage + "\n");
            out.flush();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    GetMessage th = new GetMessage();
    th.start();
}

// Client가 입력한 문자열
class GetMessage extends Thread {
    @Override
    public void run() {
        String clientMessage = null;
        while (true) {
            try {
                if (clientMessage == null) {
                    return;
                }
                clientMessage = in.readLine();
                System.out.println("클라이언트: " + clientMessage);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    new Server();
}

}

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

public class Client { private Socket socket = null; private BufferedReader in = null; private BufferedWriter out = null; private Scanner sc = new Scanner(System.in);

public Client() {
    GetMessage th = new GetMessage();
    th.start();
    try {
        socket = new Socket("localhost", 9999);
        System.out.println("연결 완료");

        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        // Client가 입력한 문자열
        String clientMessage;
        while (true) {
            System.out.print("클라이언트: ");
            clientMessage = sc.nextLine();
            out.write(clientMessage + "\n");
            out.flush();
        }

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

// Server가 입력한 문자열
class GetMessage extends Thread {
    @Override
    public void run() {
        String serverMessage = null;
        while (true) {
            try {
                if (serverMessage == null) {
                    return;
                }
                serverMessage = in.readLine();
                System.out.println("서버: " + serverMessage);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args) {
    new Client();
}

}

서버 측에서 문자를 전송하면 클라이언트 쪽에서 문자가 보이지 않습니다. 무엇이 문제인가요?

1 답변

  • 
    
    public Server() {
        GetMessage th = new GetMessage();
        th.start();
    
    
    
        try {
            System.out.println("연결 대기중");
            serverSocket = new ServerSocket(9999);
            socket = serverSocket.accept();
            System.out.println("연결 완료");
    
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    
            // Server가 입력한 문자열
            String serverMessage = null;
            while (true) {
                System.out.print("서버: ");
                serverMessage = sc.nextLine();
                out.write(serverMessage + "\n");
                out.flush();
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    이렇게 아래 쓰레드 실행 부분을 try 보다 먼저 실행되게 한번 사부작 해보세요! while(true) 라서 아래 있으면 쓰레드가 실행되지 않을 것 같습니다.

    GetMessage th = new GetMessage();
        th.start();
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)