본문 바로가기

Dev Ref/Java

Chat_Application_TCP_Server(+exe file)

Chat_Application_Sever.zip

(사진출처)http://it.donga.com/18906/



Multi Chatting Program_Server

오늘 포스팅할 내용은


자바에서 Socket을 사용하여 서버와 클라이언트를


동기화 하는 방법을 예제 프로젝트로 


포스팅하도록 하겠습니다.


(+ exe파일은 위에 첨부해 두었습니다)



Chat_MainServer


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package Chat_Server;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
 
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;
 
public class Chat_MainServer extends JFrame implements ActionListener {
    public final static int SEVER_PORT = 9000;
    public static int EnterCnt;
    public static JLabel lb2;
    public static JTextArea ta;
    private JTextField tf;
    private JScrollPane scr;
    private JPanel pl1, pl2, pl3, pl4;
    private JButton bt1, bt2, bt3;
    private JLabel lb1, lb3;
 
    private Socket socket;
    private ArrayList<Socket> list;
 
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
 
    public void setList(ArrayList<Socket> list) {
        this.list = list;
    }
 
    public Chat_MainServer() {
        super("Sever ManageMent");
 
        ta = new JTextArea();
        scr = new JScrollPane(ta);
        scr.setPreferredSize(new Dimension(200120));
 
        pl1 = new JPanel();
        pl1.setLayout(new GridLayout(12));
 
        lb1 = new JLabel("접속자 : ");
        lb1.setHorizontalAlignment(lb1.CENTER);
        lb1.setFont(new Font("Gothic", Font.BOLD, 13));
        pl1.add(lb1);
 
        lb2 = new JLabel("0명");
        lb2.setHorizontalAlignment(lb2.CENTER);
        lb2.setFont(new Font("Gothic", Font.BOLD, 15));
        pl1.add(lb2);
 
        pl2 = new JPanel();
        pl2.setLayout(new GridLayout(21));
 
        pl3 = new JPanel();
        pl3.setLayout(new FlowLayout());
 
        lb3 = new JLabel("공지 : ");
        lb3.setHorizontalAlignment(lb3.CENTER);
        lb3.setFont(new Font("Gothic", Font.BOLD, 15));
        pl3.add(lb3);
 
        tf = new JTextField(25);
        pl3.add(tf);
 
        bt3 = new JButton("전송");
        pl3.add(bt3);
 
        pl2.add(pl3);
 
        pl4 = new JPanel();
        pl4.setLayout(new GridLayout(12));
 
        bt1 = new JButton("Clear");
        pl4.add(bt1);
        bt2 = new JButton("Exit");
        pl4.add(bt2);
 
        pl2.add(pl4);
 
        setLayout(new BorderLayout());
        add("North", pl1);
        add("Center", scr);
        add("South", pl2);
 
        setBounds(720220480640);
        setBackground(Color.GRAY);
        setVisible(true);
 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
 
        bt1.addActionListener(this);
        bt2.addActionListener(this);
        bt3.addActionListener(this);
        tf.addActionListener(this);
        ta.setEditable(false);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = (Object) e.getSource();
        if (obj == bt1) {
            ta.setText("");
        } else if (obj == bt2) {
            String msg = "# 공지 : 서버를 종료합니다";
            sendMsg(msg);
            System.exit(0);
        } else if (obj == bt3 || obj == tf) {
            if(tf.getText().equals("")) {
                return;
            }
            String msg = "# 공지 : " + tf.getText();
            sendMsg(msg);
            tf.setText("");
        }
    }
 
    // send Message
    public void sendMsg(String msg) {
        PrintWriter writer = null;
        for (int i = 0; i < list.size(); i++) {
            Socket s = list.get(i);
            try {
                writer = new PrintWriter(s.getOutputStream());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            writer.println(msg);
            writer.flush();
        }
        ta.append(msg + "\n");
    }
 
    public static void main(String[] args) {
        Chat_MainServer cm = new Chat_MainServer();
        ArrayList<Socket> list = new ArrayList<>();
 
        EnterCnt = 0;
        try {
            ServerSocket serSock = new ServerSocket(SEVER_PORT);
            while (true) {
                ta.append("[알림] 접속 대기중..." + "\n");
                Socket socket = serSock.accept();
                list.add(socket);
                EnterCnt++;
                lb2.setText(EnterCnt + "명");
                ta.append("IP:" + socket.getInetAddress() + " Port:" + socket.getPort() + "\n");
                new Chat_BackGround(socket, list).start();
                ta.setCaretPosition(ta.getDocument().getLength());
                cm.setList(list);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs



Chat_BackGround


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package Chat_Server;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
 
public class Chat_BackGround extends Thread {
    private Socket socket;
    private ArrayList<Socket> list = new ArrayList<>();
 
    public Chat_BackGround(Socket socket, ArrayList<Socket> list) {
        this.socket = socket;
        this.list = list;
    }
 
    @Override
    public void run() {
        super.run();
        try {
            while (true) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = reader.readLine();
                Chat_MainServer.ta.append("IP : " + socket.getInetAddress() + " 받은 내용 : " + msg + "\n");
                for (int i = 0; i < list.size(); i++) {
                    Socket s = list.get(i);
                    if (s != socket) {
                        PrintWriter writer = new PrintWriter(s.getOutputStream());
                        writer.println(msg);
                        writer.flush();
                    }
                }
                Thread.sleep(100);
            }
        } catch (IOException e) {
            Chat_MainServer.ta.append("연결끊김 IP : " + socket.getInetAddress() + " Port : " + socket.getPort() + "\n");
            list.remove(socket);
            Chat_MainServer.EnterCnt--;
            Chat_MainServer.lb2.setText(Chat_MainServer.EnterCnt + "명");
            for (Socket s : list) {
                Chat_MainServer.ta.append("- 현재 클라이언트 IP : " + s.getInetAddress() + " Port : " + s.getPort() + "\n");
            }
            try {
                socket.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
 
cs