(사진출처)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(); } } } | 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 |
'오랜된 포스팅 > 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 |