nodejs8- 자바클라이언트 채팅 베이직/java client chat basic

nodejs가 대부분 웹사이트 만들기 위한 도구로 알고 계신 분이 많은 것 같습니다.
It seems like most people know nodejs as a tool for creating websites.

아래는 nodejs를 서버로 사용하고 자바를 채팅 클라이언트로 사용하는 매우 간단한 프로그램입니다.
Below is a very simple program that uses nodejs as a server and java as a chat client.

기초를 쌓는데 도움이 되리라 생각합니다.
I think it will help build a foundation.

자바 컴파일시 한글문자가 있기 때문에 UTF-8인코딩으로 컴파일하고 실행도 UTF-8로 실행해야 합니다.
Since there are Korean characters when compiling Java, you must compile it in UTF-8 encoding and run it in UTF-8 as well.

compile : javac -encoding UTF-8 FILENAME.java
command prompt run : java -Dfile.encoding=UTF-8 FILENAME
window powershell run : java “-Dfile.encoding=UTF-8” FILENAME

server.js는 nodejs서버 프로그램입니다. server.js is a nodejs server program.
ChatClientGUI.java는 GUI프로그램입니다. ChatClientGUI.java is a GUI program.
ChatClinet는 명령프롬프트를 사용하는 프로그램입니다. ChatClient is a program that uses a command prompt.

server.js

const net = require('net');

const server = net.createServer((socket) => {
  console.log('클라이언트가 연결되었습니다.\nThe client is connected');

  socket.on('data', (data) => {
    console.log('클라이언트로부터 받은 데이터\nData received from client:', data.toString());
    socket.write('서버가 받은 데이터를 다시 보냅니다\nThe server sends back the data it received.: ' + data);
  });

  socket.on('end', () => {
    console.log('클라이언트 연결이 끊어졌습니다.\nThe client connection was lost.');
  });

  socket.on('error', (err) => {
    console.error('클라이언트 소켓 에러\nclient socket error:', err);
  });
});

const port = 3000;
server.listen(port, () => {
  console.log(`서버가 포트 ${port}에서 리스닝 중입니다.\nThe server is listening on port ${port}.`);
});

server.on('error', (err) => {
  console.error('서버 에러server error:', err);
});

Client.java

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

public class Client {
    public static void main(String[] args) {
        String serverAddress = "localhost"; // 서버 주소 : server address
        int serverPort = 3000; // 서버 포트 : server port

        try (
            Socket socket = new Socket(serverAddress, serverPort);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            Scanner scanner = new Scanner(System.in)
        ) {
            System.out.println("서버에 연결되었습니다.\n server connected");

            String userInput;
            while (true) {
                System.out.print("보낼 메시지 sendmessage: ");
                userInput = scanner.nextLine();
                if ("exit".equalsIgnoreCase(userInput)) {
                    break;
                }
                out.println(userInput);
                String serverResponse = in.readLine();
                System.out.println("서버 응답 server response: " + serverResponse);
            }
            System.out.println("연결을 종료합니다. Server connection terminated");

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

// 인코딩 문제가 있을 수 있으니 메세지 발송시 영문으로 테스트 할것
// 윈도우 파워쉘인경우 오류 날 수 있으니 명령프롬프트를 사용 할 것
// There may be encoding issues, so please test in English when sending the message.
// If you are using Windows Powershell, you may get an error, so use the command prompt.
//
// UTF-8컴파일:UTF-8compile : javac -encoding UTF-8 Client.java
// UTF-8실행:UTF-8 run : java -Dfile.encoding=UTF-8 Client
//
// 윈도우 파워쉘 실행: window powershell run : java "-Dfile.encoding=UTF-8" Client

ChatClientGUI.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClientGUI extends JFrame implements ActionListener {

    private static final String SERVER_ADDRESS = "localhost";
    private static final int SERVER_PORT = 3000;

    private JTextArea chatArea;
    private JTextField messageInput;
    private JButton sendButton;
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;

    public ChatClientGUI() {
        setTitle("채팅 클라이언트/chat client");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLayout(new BorderLayout());

        chatArea = new JTextArea();
        chatArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(chatArea);
        add(scrollPane, BorderLayout.CENTER);

        JPanel inputPanel = new JPanel(new BorderLayout());
        messageInput = new JTextField();
        sendButton = new JButton("보내기/send");
        sendButton.addActionListener(this);

        inputPanel.add(messageInput, BorderLayout.CENTER);
        inputPanel.add(sendButton, BorderLayout.EAST);
        add(inputPanel, BorderLayout.SOUTH);

        setVisible(true);

        connectToServer();
    }

    private void connectToServer() {
        try {
            socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            chatArea.append("서버에 연결되었습니다.\nsercer connected");

            // 서버로부터 메시지를 수신하는 스레드 시작
            Thread receiveThread = new Thread(this::receiveMessages);
            receiveThread.start();

        } catch (IOException e) {
            chatArea.append("서버 연결에 실패했습니다: " + e.getMessage() + "\n");
        }
    }

    private void receiveMessages() {
        String message;
        try {
            while ((message = in.readLine()) != null) {
                chatArea.append("서버server: " + message + "\n");
            }
        } catch (IOException e) {
            chatArea.append("서버 연결이 끊어졌습니다.\nFailed to connect to server.");
        } finally {
            closeConnection();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == sendButton) {
            String message = messageInput.getText();
            if (!message.isEmpty()) {
                out.println(message);
                chatArea.append("나Me: " + message + "\n");
                messageInput.setText("");
            }
        }
    }

    private void closeConnection() {
        try {
            if (out != null) out.close();
            if (in != null) in.close();
            if (socket != null && !socket.isClosed()) socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(ChatClientGUI::new);
    }
}

// 인코딩 문제가 있을 수 있으니 메세지 발송시 영문으로 테스트 할것
// 윈도우 파워쉘인경우 오류 날 수 있으니 명령프롬프트를 사용 할 것
// There may be encoding issues, so please test in English when sending the message.
// If you are using Windows Powershell, you may get an error, so use the command prompt.
//
// UTF-8컴파일:UTF-8compile : javac -encoding UTF-8 ChatClientGUI.java
// UTF-8실행:UTF-8 run : java -Dfile.encoding=UTF-8 ChatClientGUI
//
// 윈도우 파워쉘 실행: window powershell run : java "-Dfile.encoding=UTF-8" ChatClientGUI

Leave a Reply

Your email address will not be published. Required fields are marked *