https://www.youtube.com/watch?v=h68nHkOI2m4
package mychat2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private ClientFrame clientFrame;
private String Name;
public Client(String serverAddress, int serverPort, ClientFrame clientFrame) {
this.clientFrame = clientFrame;
Name = clientFrame.getInputID().getText();
try {
socket = new Socket(serverAddress, serverPort);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
clientFrame.setPrintWriter(out);
// 서버측에게 프로토콜 전송
out.println(Name);
out.flush();
//clientFrame.appendMessage(Name + "등장");
String message;
System.out.println("client ~~~~~~~~");
while ((message = in.readLine()) != null) {
System.out.println("-------------------");
clientFrame.appendMessage( " => " + message);
}
} catch (Exception e) {
clientFrame.appendMessage("SEVER ERROR!!! : " + e.getMessage());
}
}
}
package mychat2;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.PrintWriter;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class ClientFrame extends JFrame {
private JScrollPane scrollPane;
private BackgroundPanel backgroundPanel;
private JPanel mainPanel;
private JTextArea mainBoard;
private JPanel portPanel;
private JLabel portLabel;
private JPanel ipPanel;
private JLabel ipLabel;
private JTextField inputPort;
private JTextField inputIp;
private JButton connectBtn;
private JTextArea messageArea;
private JTextField textField;
private PrintWriter out;
private JPanel idPanel;
private JLabel idLabel;
private JTextField inputID;
private String id;
public ClientFrame() {
initData();
initLayout();
initListener();
}
private void initData() {
backgroundPanel = new BackgroundPanel();
// 메인
mainPanel = new JPanel();
mainBoard = new JTextArea();
scrollPane = new JScrollPane();
// 포트
portPanel = new JPanel();
portLabel = new JLabel("PORT NUMBER");
// 아이피
inputPort = new JTextField(10);
ipPanel = new JPanel();
ipLabel = new JLabel("IP ADDRESS");
inputIp = new JTextField(10);
// 버튼
connectBtn = new JButton("Connect");
// 메세지
messageArea = new JTextArea(8, 40);
textField = new JTextField(40);
// 닉네임
idPanel = new JPanel();
idLabel = new JLabel("닉네임");
inputID = new JTextField(10);
// 기본 값
inputPort.setText("5010");
inputIp.setText("localhost");
inputID.setText("너의 이름은?");
}
private String getid() {
return id;
}
private void initLayout() {
setTitle("채팅채팅");
setSize(700, 820);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
setResizable(false);
backgroundPanel.setSize(getWidth(), getHeight());
backgroundPanel.setLayout(null);
add(backgroundPanel);
idPanel.setBounds(50, 40, 510, 50);
idPanel.setBackground(new Color(0, 0, 0, 0));
idPanel.add(idLabel);
idPanel.add(inputID);
backgroundPanel.add(idPanel);
ipPanel.setBounds(50, 70, 480, 50);
ipPanel.setBackground(new Color(0, 0, 0, 0));
ipPanel.add(ipLabel);
ipPanel.add(inputIp);
backgroundPanel.add(ipPanel);
portPanel.setBounds(50, 100, 550, 50);
portPanel.setBackground(new Color(0, 0, 0, 0));
portPanel.add(portLabel);
portPanel.add(inputPort);
portPanel.add(connectBtn);
backgroundPanel.add(portPanel);
mainPanel.setBorder(new TitledBorder(new LineBorder(Color.BLACK, 5), "Chat"));
mainPanel.setBounds(40, 150, 600, 500);
mainPanel.setBackground(Color.WHITE);
mainBoard.setEnabled(false);
//mainPanel.setLayout(new BorderLayout());
scrollPane.setBounds(40, 150, 600, 500);
scrollPane.setViewportView(mainBoard);
//mainPanel.add(new JScrollPane(mainBoard), BorderLayout.CENTER);
backgroundPanel.add(scrollPane);
JPanel messagePanel = new JPanel();
messagePanel.setLayout(new BorderLayout());
messagePanel.setBounds(40, 660, 600, 100);
messagePanel.add(textField, BorderLayout.CENTER);
JButton sendButton = new JButton("Send");
messagePanel.add(sendButton, BorderLayout.EAST);
backgroundPanel.add(messagePanel);
setVisible(true);
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
textField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
}
private void initListener() {
connectBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int port = Integer.parseInt(inputPort.getText());
String ip = inputIp.getText();
new Thread(() -> new Client(ip, port, ClientFrame.this)).start();
}
});
}
private void sendMessage() {
id = inputID.getText();
String message = textField.getText();
if (!message.isEmpty()) {
out.println(id + " : " + message);
// appendMessage(inputID +" : " + message);
textField.setText("");
autoScrollPane();
}
}
public void autoScrollPane() {
scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());
}
public JPanel getIdPanel() {
return idPanel;
}
public void setIdPanel(JPanel idPanel) {
this.idPanel = idPanel;
}
public JLabel getIdLabel() {
return idLabel;
}
public void setIdLabel(JLabel idLabel) {
this.idLabel = idLabel;
}
public JTextField getInputID() {
return inputID;
}
public void setInputID(JTextField inputID) {
this.inputID = inputID;
}
public void setPrintWriter(PrintWriter out) {
this.out = out;
}
public void appendMessage(String message) {
mainBoard.append(message + "\n");
}
private class BackgroundPanel extends JPanel {
private Image backgroundImage;
public BackgroundPanel() {
backgroundImage = new ImageIcon("img/grey.jpg").getImage();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), null);
}
}
public static void main(String[] args) {
new ClientFrame();
}
}
package mychat2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
public class Server {
private ServerFrame serverFrame;
private int PORT = 5010;
private static Vector<PrintWriter> clientWriters = new Vector<>();
public Server(int port, ServerFrame serverFrame) {
this.PORT = port;
this.serverFrame = serverFrame;
startServer();
}
private void startServer() {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
serverFrame.appendMessage("서버가 포트 " + PORT + "에서 시작되었습니다.");
while (true) {
Socket socket = serverSocket.accept();
serverFrame.appendMessage("클라이언트 연결됨 : " + socket.getInetAddress());
new ClientHandler(socket, serverFrame).start();
}
} catch (IOException e) {
serverFrame.appendMessage("서버 오류 : " + e.getMessage());
e.printStackTrace();
}
}
private static class ClientHandler extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private ServerFrame serverFrame;
private String clientID;
public ClientHandler(Socket socket, ServerFrame serverFrame) {
this.socket = socket;
this.serverFrame = serverFrame;
}
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
clientID = in.readLine();
serverFrame.appendMessage(clientID + "님 [등.장]");
clientWriters.add(out);
broadcastMessage(clientID + "님 [등.장]");
String message;
while ((message = in.readLine()) != null) {
serverFrame.appendMessage("수신됨 : " + message);
broadcastMessage(message);
}
} catch (IOException e) {
serverFrame.appendMessage("클라이언트 처리 오류 : " + e.getMessage());
e.printStackTrace();
} finally {
try {
serverFrame.appendMessage(clientID + "님 [퇴장]");
broadcastMessage(clientID + "님 [퇴장]");
socket.close();
serverFrame.appendMessage("클라이언트 연결 해제됨 : " + socket.getInetAddress());
} catch (IOException e) {
serverFrame.appendMessage("소켓 종료 오류 : " + e.getMessage());
e.printStackTrace();
}
}
}
private void broadcastMessage(String message) {
System.out.println("방송 확인 ");
for (PrintWriter writer : clientWriters) {
System.out.println("111111111111111111 " + message);
writer.println(message);
writer.flush();
}
}
}
}
package mychat2;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class ServerFrame extends JFrame {
private JScrollPane scrollPane;
private BackgroundPanel backgroundPanel;
private JPanel mainPanel;
private JTextArea mainBoard;
private JPanel portPanel;
private JLabel portLabel;
private JTextField inputPort;
private JButton connectBtn;
public ServerFrame() {
initData();
initLayout();
initListener();
}
private void initData() {
backgroundPanel = new BackgroundPanel();
mainPanel = new JPanel();
mainBoard = new JTextArea();
scrollPane = new JScrollPane();
portPanel = new JPanel();
portLabel = new JLabel("PORT NUMBER");
inputPort = new JTextField(10);
connectBtn = new JButton("Connect");
inputPort.setText("5010");
}
private void initLayout() {
setTitle("서버관리자");
setSize(400, 500);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
setResizable(false);
backgroundPanel.setSize(getWidth(), getHeight());
backgroundPanel.setLayout(null);
add(backgroundPanel);
portPanel.setBounds(50, 30, 300, 50);
portPanel.setBackground(new Color(0, 0, 0, 0));
portPanel.add(portLabel);
portPanel.add(inputPort);
portPanel.add(connectBtn);
backgroundPanel.add(portPanel);
mainPanel.setBorder(new TitledBorder(new LineBorder(Color.BLACK, 5), "Server"));
mainPanel.setBounds(40, 100, 320, 350);
mainPanel.setBackground(Color.WHITE);
mainBoard.setEnabled(false);
mainPanel.add(scrollPane);
scrollPane.setBounds(45, 100, 300, 315);
scrollPane.setViewportView(mainBoard);
//scrollPane.add(mainBoard);
backgroundPanel.add(scrollPane);
setVisible(true);
}
private void initListener() {
connectBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int port = Integer.parseInt(inputPort.getText());
new Thread(() -> new Server(port, ServerFrame.this)).start();
}
});
}
public void appendMessage(String message) {
mainBoard.append(message + "\n");
autoScrollPane();
}
private class BackgroundPanel extends JPanel {
private Image backgroundImage;
public BackgroundPanel() {
backgroundImage = new ImageIcon("img/back.jpg").getImage();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), null);
}
}
public void autoScrollPane() {
scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());
}
public static void main(String[] args) {
new ServerFrame();
}
}
'My project' 카테고리의 다른 글
팀 프로젝트 스윙 크레이지 아케이드 (0) | 2024.06.24 |
---|