My project

개인 프로젝트 양방향 소켓통신

H_u 2024. 6. 24. 09:48
728x90
반응형
SMALL

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();

}

}

728x90
반응형
SMALL

'My project' 카테고리의 다른 글

팀 프로젝트 스윙 크레이지 아케이드  (0) 2024.06.24