(사진출처)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(200, 120)); 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(300, 300, 450, 300); 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(300, 300, 250, 200); 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 |
'오랜된 포스팅 > Java' 카테고리의 다른 글
Swing Look&Feel 라이브러리 사용 및 적용방법 (0) | 2018.06.26 |
---|---|
JFrame/swing 배경이미지 넣는 방법 (0) | 2018.06.24 |
Chat_Application_TCP_Server(+exe file) (0) | 2018.06.17 |
Baseball member management project(+Singleton Func) (0) | 2018.06.10 |
Number Baseball Game ver_02 (+G.U.I 기능추가) (0) | 2018.06.09 |