목차
- 자바 javac 명령 활용 자바 소스 코드 컴파일 및 실행 예제 이전 포스팅 참고 학습
- 자바 Swing 활용 채팅 소켓 프로그래밍 채팅방 현황 확인 UI 만들기 예제 이전 포스팅 참고 학습
- 자바 JNI malloc, free 활용하여 포인터 사용하기 예제 이전 포스팅 참고 학습
- 자바 Swing 활용 이전 포스팅에 이어 시작 버튼 클릭시 소켓 Listen 하는 예제
- 자바 Swing 활용 중지 버튼 클릭시 소켓 Close 하는 예제
자바 javac 명령 활용 자바 소스 코드 컴파일 및 실행 예제 이전 포스팅 참고 학습
이전 포스팅의 항목에서는 자바 소스 코드를 컴파일하고 실행하는 방법을 다룹니다. 자바 컴파일러인 javac 명령어를 사용하여 소스 코드를 컴파일하고, 그 결과로 생성된 클래스 파일을 java 명령어를 사용하여 실행하는 방법을 설명합니다. 이를 통해 자바 프로그램을 개발하고 실행하는 기본적인 프로세스를 학습할 수 있습니다. 오늘 예제도 자바 소스 코드를 실행해야하는 예제이기때문에 해당 내용을 아직 모르신다면 아래 링크를 참고하여 학습해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 Swing 활용 채팅 소켓 프로그래밍 채팅방 현황 확인 UI 만들기 예제 이전 포스팅 참고 학습
다음으로 이전 포스팅의 항목에서는 자바 Swing을 사용하여 채팅 소켓 프로그램의 채팅방 현황을 확인할 수 있는 UI를 만드는 방법을 다룹니다. 오늘은 이 포스팅에 더불어 시작 버튼을 누르면 실제 서버 소켓이 listen 상태로 변하고 중지를 누르면 서버 소켓을 close하는 예제를 작성하겠습니다. 따라서 반드시 해당 포스팅을 확인안하셨다면 아래 링크를 먼저 참고 학습해주세요.
2023.09.21 - [Java] - [Java/Linux] 자바 Swing 활용 채팅 소켓 프로그래밍 서버 예제 - 1(서버 시작 및 채팅방 현황 확인 UI 만들기)
자바 JNI malloc, free 활용하여 포인터 사용하기 예제 이전 포스팅 참고 학습
마지막으로 이전 포스팅에서는 자바 네이티브 인터페이스(JNI)를 활용하여 메모리 할당 및 해제를 직접 관리하는 방법과 예제를 알아보았습니다. JNI를 사용하여 C 라이브러리와 상호 작용하고, malloc 및 free 함수를 사용하여 메모리를 할당하고 해제하는 예제가 포함되어있습니다. 포인터는 메모리를 효율적으로 활용할 수 있는 기능입니다. 이러한 포인터를 자바에서 사용하고 싶으시다면 아래 링크를 참고해주세요.
2023.09.19 - [Java] - [Java/C] 자바 JNI malloc, free 활용 메모리 동적 할당 변수 생성,삭제,값 저장 예제(포인터)
자바 Swing 활용 이전 포스팅에 이어 시작 버튼 클릭시 소켓 Listen 하는 예제
아래는 이전에 작성한 채팅 소켓 프로그램 예제에 이어서, 시작 버튼을 클릭하면 소켓을 Listen하는 부분을 구현하는 예제입니다. 이를 통해 채팅 서버를 시작하고 클라이언트의 연결을 수신할 수 있게 됩니다. 그리고 반드시 중지 버튼 등 버튼 UI는 계속 누를 수 있어야하기때문에 스레드를 생성하여 accept를 수행합니다. 그래야 블록킹이 되질 않습니다.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetSocketAddress;
public class ServerControlExample {
private static final int PORT = 12345;
private static ServerSocket serverSocket;
private static boolean isListening = false;
private static Thread acceptThread;
public static void main(String[] args) {
JFrame frame = new JFrame("Server");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
JPanel panel = new JPanel();
frame.add(panel);
JButton startButton = new JButton("Start Server");
JButton stopButton = new JButton("Stop Server");
JList<String> chatRoomList = new JList<>(new DefaultListModel<>());
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultListModel<String> model = (DefaultListModel<String>) chatRoomList.getModel();
model.addElement("Chat Room 1");
model.addElement("Chat Room 2");
if (!isListening) {
acceptThread = new Thread(new Runnable() {
@Override
public void run() {
try {
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
InetSocketAddress addressV4 = new InetSocketAddress("0.0.0.0", PORT);
serverSocket.bind(addressV4);
isListening = true;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Server started and listening on port " + PORT);
}
});
while (isListening) {
Socket clientSocket = serverSocket.accept();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Client connected from " + clientSocket.getInetAddress());
}
});
}
} catch (IOException ex) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Error starting server: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
});
}
}
});
acceptThread.start();
}
}
});
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultListModel<String> model = (DefaultListModel<String>) chatRoomList.getModel();
model.clear();
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(stopButton);
frame.add(buttonPanel, BorderLayout.NORTH);
frame.add(new JScrollPane(chatRoomList), BorderLayout.CENTER);
frame.setVisible(true);
}
}
자바 Swing 활용 중지 버튼 클릭시 소켓 Close 하는 예제
아래는 이전 예제에 이어서 중지 버튼을 클릭하면 소켓을 닫는 부분을 구현하는 예제입니다. 이를 통해 채팅 서버를 중지하고 클라이언트 연결을 종료할 수 있게 됩니다.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetSocketAddress;
public class ServerControlExample {
private static final int PORT = 12345;
private static ServerSocket serverSocket;
private static boolean isListening = false;
private static Thread acceptThread;
public static void main(String[] args) {
JFrame frame = new JFrame("Server");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
JPanel panel = new JPanel();
frame.add(panel);
JButton startButton = new JButton("Start Server");
JButton stopButton = new JButton("Stop Server");
JList<String> chatRoomList = new JList<>(new DefaultListModel<>());
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultListModel<String> model = (DefaultListModel<String>) chatRoomList.getModel();
model.addElement("Chat Room 1");
model.addElement("Chat Room 2");
if (!isListening) {
acceptThread = new Thread(new Runnable() {
@Override
public void run() {
try {
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
InetSocketAddress addressV4 = new InetSocketAddress("0.0.0.0", PORT);
serverSocket.bind(addressV4);
isListening = true;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Server started and listening on port " + PORT);
}
});
while (isListening) {
Socket clientSocket = serverSocket.accept();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Client connected from " + clientSocket.getInetAddress());
}
});
}
} catch (IOException ex) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Error starting server: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
});
}
}
});
acceptThread.start();
}
}
});
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultListModel<String> model = (DefaultListModel<String>) chatRoomList.getModel();
model.clear();
if (isListening) {
isListening = false;
try {
serverSocket.close();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Server stopped.");
}
});
} catch (IOException ex) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(frame, "Error stopping server: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
});
}
}
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(stopButton);
frame.add(buttonPanel, BorderLayout.NORTH);
frame.add(new JScrollPane(chatRoomList), BorderLayout.CENTER);
frame.setVisible(true);
}
}