import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatServerSwing extends JFrame {
private JTextArea display;
private JTextField input;
private PrintWriter out;
private BufferedReader in;
public ChatServerSwing() {
setTitle("서버 채팅");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 채팅 화면 구성
display = new JTextArea();
display.setEditable(false);
JScrollPane scrollPane = new JScrollPane(display);
input = new JTextField();
input.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String message = input.getText();
if (!message.isEmpty()) {
out.println(message);
display.append("서버: " + message + "\n");
input.setText("");
if (message.equals("bye")) {
System.exit(0);
}
}
}
});
add(scrollPane, BorderLayout.CENTER);
add(input, BorderLayout.SOUTH);
setSize(400, 300);
setVisible(true);
// 서버 소켓 생성 및 클라이언트 연결 대기
ServerSocket serverSocket = null;
int port = 9999;
while (serverSocket == null && port < 10010) {
try {
serverSocket = new ServerSocket(port);
display.append("서버가 포트 " + port + "에서 시작되었습니다. 클라이언트의 연결을 기다립니다...\n");
// 사용 중인 포트를 파일에 저장
try (PrintWriter portWriter = new PrintWriter(new FileWriter("port.txt"))) {
portWriter.println(port);
}
} catch (IOException e) {
display.append("포트 " + port + "가 이미 사용 중입니다. 다른 포트를 시도합니다...\n");
port++;
}
}
if (serverSocket == null) {
display.append("사용 가능한 포트를 찾을 수 없습니다.\n");
return;
}
try {
Socket socket = serverSocket.accept();
display.append("클라이언트가 연결되었습니다.\n");
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 메시지 수신을 위한 스레드
new Thread(() -> {
try {
String message;
while ((message = in.readLine()) != null) {
final String msg = message;
SwingUtilities.invokeLater(() -> {
display.append("클라이언트: " + msg + "\n");
});
if (message.equals("bye")) {
System.exit(0);
}
}
} catch (IOException e) {
display.append("수신 오류: " + e.getMessage() + "\n");
}
}).start();
} catch (IOException e) {
display.append("서버 오류: " + e.getMessage() + "\n");
}
}
public static void main(String[] args) {
new ChatServerSwing();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatClientSwing extends JFrame {
private JTextArea display;
private JTextField input;
private PrintWriter out;
private BufferedReader in;
public ChatClientSwing() {
setTitle("클라이언트 채팅");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 채팅 화면 구성
display = new JTextArea();
display.setEditable(false);
JScrollPane scrollPane = new JScrollPane(display);
input = new JTextField();
input.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String message = input.getText();
if (!message.isEmpty()) {
out.println(message);
display.append("클라이언트: " + message + "\n");
input.setText("");
if (message.equals("bye")) {
System.exit(0);
}
}
}
});
add(scrollPane, BorderLayout.CENTER);
add(input, BorderLayout.SOUTH);
setSize(400, 300);
setVisible(true);
// 서버에 연결
Socket socket = null;
int port = 9999;
// 포트 파일에서 서버 포트 읽기
try (BufferedReader portReader = new BufferedReader(new FileReader("port.txt"))) {
port = Integer.parseInt(portReader.readLine());
display.append("서버 포트 " + port + "로 연결을 시도합니다...\n");
} catch (IOException | NumberFormatException e) {
display.append("포트 정보를 읽을 수 없습니다. 기본 포트 9999를 사용합니다.\n");
}
try {
socket = new Socket("localhost", port);
display.append("서버에 포트 " + port + "로 연결되었습니다.\n");
} catch (IOException e) {
display.append("서버 연결 오류: " + e.getMessage() + "\n");
return;
}
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 메시지 수신을 위한 스레드
new Thread(() -> {
try {
String message;
while ((message = in.readLine()) != null) {
final String msg = message;
SwingUtilities.invokeLater(() -> {
display.append("서버: " + msg + "\n");
});
if (message.equals("bye")) {
System.exit(0);
}
}
} catch (IOException e) {
display.append("수신 오류: " + e.getMessage() + "\n");
}
}).start();
} catch (IOException e) {
display.append("연결 오류: " + e.getMessage() + "\n");
}
}
public static void main(String[] args) {
new ChatClientSwing();
}
}
'Language > java' 카테고리의 다른 글
[Java] 무한배열 연습하기 (0) | 2024.04.02 |
---|---|
[Java] Generic Method (0) | 2024.03.22 |
[Java] Generic2 (0) | 2024.03.22 |
[Java] Generic (1) | 2024.03.22 |
[Java] Input/Output Stream (0) | 2024.03.22 |