Chat_Application_TCP_Server(+exe file)

2018. 6. 17. 16:43·오랜된 포스팅/Java

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(200, 120));
 
        pl1 = new JPanel();
        pl1.setLayout(new GridLayout(1, 2));
 
        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(2, 1));
 
        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(1, 2));
 
        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(720, 220, 480, 640);
        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();
        }
    }
}
Colored by Color Scripter
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();
        }
    }
}
 
Colored by Color Scripter
cs




저작자표시 비영리 변경금지 (새창열림)

'오랜된 포스팅 > Java' 카테고리의 다른 글

JFrame/swing 배경이미지 넣는 방법  (0) 2018.06.24
Chat_Application_TCP_Client(+exe file)  (0) 2018.06.18
Baseball member management project(+Singleton Func)  (0) 2018.06.10
Number Baseball Game ver_02 (+G.U.I 기능추가)  (0) 2018.06.09
이클립스 한글 깨짐 방지 환경설정  (1) 2018.06.07
'오랜된 포스팅/Java' 카테고리의 다른 글
  • JFrame/swing 배경이미지 넣는 방법
  • Chat_Application_TCP_Client(+exe file)
  • Baseball member management project(+Singleton Func)
  • Number Baseball Game ver_02 (+G.U.I 기능추가)
Toycode
Toycode
오늘도 훌륭했던 시간을 보내길 바라며
  • Toycode
    오늘도 훌륭했어
    Toycode
  • 전체
    오늘
    어제
    • 분류 전체보기 (48)
      • 블록체인 (0)
      • 기초 CS 파훼하기 (2)
      • IT 트렌드 (1)
      • 오랜된 포스팅 (45)
        • Java (25)
        • SQL Developer (14)
        • eGovFramework (5)
        • IOS (1)
  • 링크

    • Online Resume
  • hELLO· Designed By정상우.v4.10.0
Toycode
Chat_Application_TCP_Server(+exe file)
상단으로

티스토리툴바