본문 바로가기

Dev Ref/Java

Chat_Application_TCP_Client(+exe file)

Chat_Application_Client.zip

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

Multi Chatting Program_Client

오늘 포스팅할 내용은

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

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

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

연동 서버 포스팅

2018/06/17 - [Java/Open source] - Chat_Application_Server(+exe file)

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



ClientFrame


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
package main;
 
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
import level.ChatLevel;
import net.ReadThread;
import net.WriteClass;
 
public class ClientFrame extends JFrame implements ActionListener {
    public final static int PORT_NUMBER = 9000;
    public static Socket socket;
    private WriteClass wc;
 
    // GUI Variable
    public JTextArea ta;
    public JTextField tf;
    private JButton bt1, bt2;
    private JPanel pl;
    private JScrollPane scr;
 
    public boolean isFirst;
 
    public ClientFrame() {
        isFirst = true;
 
        wc = new WriteClass(this);
        new Id(wc, this);
 
        ta = new JTextArea();
        ta.setEditable(false);
        scr = new JScrollPane(ta);
        scr.setPreferredSize(new Dimension(200120));
 
        add("Center", scr);
 
        pl = new JPanel();
        tf = new JTextField(25);
        pl.add(tf);
        bt1 = new JButton("Send");
        pl.add(bt1);
        bt2 = new JButton("Exit");
        pl.add(bt2);
 
        add("South", pl);
 
        bt1.addActionListener(this);
        bt2.addActionListener(this);
        tf.addActionListener(this);
 
        setBounds(300300450300);
        setVisible(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        String id = Id.getId();
 
        if (obj == bt1 || obj == tf) {
            if (tf.getText().equals("")) {
                return;
            }
            ChatLevel lv = ChatLevel.getInstance();
            String title;
            lv.checkLv();
            title = lv.getTitle();
            ta.append(title + " [" + id + "]" + tf.getText() + "\n");
            ta.setCaretPosition(ta.getDocument().getLength());
            wc.sendMsg();
            tf.setText("");
        } else if (obj == bt2) {
            JOptionPane.showMessageDialog(null"프로그램을 종료합니다.");
            System.exit(0);
        }
    }
 
    public static void main(String[] args) {
        try {
            socket = new Socket("127.0.0.1", PORT_NUMBER);
            System.out.println("연결성공");
            ClientFrame cf = new ClientFrame();
            new ReadThread(cf).start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs


ReadThread


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
package net;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;
 
import javax.swing.JOptionPane;
 
import main.ClientFrame;
 
public class ReadThread extends Thread {
    private ClientFrame cf;
 
    public ReadThread(ClientFrame cf) {
        this.cf = cf;
    }
 
    @Override
    public void run() {
        super.run();
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(cf.socket.getInputStream()));
            String str;
            while (true) {
                str = br.readLine();
                if (str == null) {
                    JOptionPane.showMessageDialog(null"접속끊김");
                    break;
                }
                cf.ta.append(str + "\n");
                cf.ta.setCaretPosition(cf.ta.getDocument().getLength());
            }
        } catch (SocketException e1) {
            JOptionPane.showMessageDialog(null"서버가 종료되었습니다");
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs



WriteClass


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
package net;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
 
import level.ChatLevel;
import main.ClientFrame;
import main.Id;
 
public class WriteClass {
    private ClientFrame cf;
    private String str, id;
 
    public WriteClass(ClientFrame cf) {
        this.cf = cf;
    }
 
    public void sendMsg() {
        ChatLevel lv = ChatLevel.getInstance();
        PrintWriter pw;
        lv.checkLv();
        String title;
        int level;
        try {
            pw = new PrintWriter(cf.socket.getOutputStream(), true);
            if (cf.isFirst) {
                InetAddress iaddr = cf.socket.getInetAddress();
                String ip = iaddr.getHostAddress();
                this.id = Id.getId();
                str = "[" + id + "]님 로그인(" + ip + ")";
            } else {
                title = lv.getTitle();
                str = title+" [" + id + "] " + cf.tf.getText();
            }
            pw.println(str);
            pw.flush();
            level = lv.getLv();
            level++;
            lv.setLv(level);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
cs


Id


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
package main;
 
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
 
import net.WriteClass;
 
public class Id extends JFrame implements ActionListener {
    // GUI Variable
    public static JTextField tf; // ID 값
    JButton bt;
    JLabel lb;
 
    WriteClass wc;
    ClientFrame cf;
 
    public Id(WriteClass wc, ClientFrame cf) {
        this.wc = wc;
        this.cf = cf;
 
        setTitle("로그인");
 
        lb = new JLabel("ID");
 
        tf = new JTextField(8);
        tf.addActionListener(this);
 
        bt = new JButton("입장");
        bt.addActionListener(this);
 
        setLayout(new FlowLayout());
        add(lb);
        add(tf);
        add(bt);
        setBounds(300300250200);
        setVisible(true);
 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
 
    public static String getId() {
        return tf.getText();
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = (Object) e.getSource();
        if (obj == bt || obj == tf) {
            if(tf.getText().equals("")) {
                JOptionPane.showMessageDialog(null"채팅에 사용할 아이디를 확인하세요");
                return;
            }
            wc.sendMsg();
            cf.isFirst = false;
            cf.setVisible(true);
            this.dispose();
        }
 
    }
}
cs


ChatLevel


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
package level;
 
public class ChatLevel {
    // 재미로 넣은 레벨 기능
    private int lv = 0;
    private String title = "";
    
    public int getLv() {
        return lv;
    }
 
    public void setLv(int lv) {
        this.lv = lv;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public void checkLv() {
        if (lv >= 0 && lv <= 5) {
            title = "<뉴비>";
        } else if (lv > 5 && lv <= 30) {
            title = "<인싸>";
        } else if (lv > 30 && lv <= 70) {
            title = "<수다쟁이>";
        } else if (lv > 70 && lv <= 100) {
            title = "<시끄러운놈>";
        }else if (lv > 100) {
            title = "<수업파괴자>";
        }
    }
    
    // Constructor
    public ChatLevel() {
 
    }
 
    private static ChatLevel single = null;
 
    public static ChatLevel getInstance() {
        if (single == null) {
            single = new ChatLevel();
        }
        return single;
    }
}
 
cs