time 
设为首页】【收藏本站
当前位置: 主页 > JAVA > JAVA网络 > java socket/swing实现的聊天程序

java socket/swing实现的聊天程序

时间:2010-10-17 20:13 点击:3511次 字体:[ ]




服务器端代码:
 

  1.   1package com.test.talk;  
  2.   2 
  3.   3import java.awt.BorderLayout;  
  4.   4import java.awt.FlowLayout;  
  5.   5import java.awt.event.ActionEvent;  
  6.   6import java.awt.event.ActionListener;  
  7.   7import java.awt.event.WindowAdapter;  
  8.   8import java.awt.event.WindowEvent;  
  9.   9import java.io.DataInputStream;  
  10.  10import java.io.DataOutputStream;  
  11.  11import java.io.IOException;  
  12.  12import java.net.BindException;  
  13.  13import java.net.ServerSocket;  
  14.  14import java.net.Socket;  
  15.  15import java.util.LinkedList;  
  16.  16import java.util.List;  
  17.  17 
  18.  18import javax.swing.JButton;  
  19.  19import javax.swing.JFrame;  
  20.  20import javax.swing.JLabel;  
  21.  21import javax.swing.JPanel;  
  22.  22import javax.swing.JTextField;  
  23.  23 
  24.  24public class Server extends JFrame  
  25.  25{  
  26.  26    boolean started = false;  
  27.  27 
  28.  28    private ServerSocket ss = null;  
  29.  29 
  30.  30    private List clientList = new LinkedList();  
  31.  31 
  32.  32    private JLabel portLbl = null;  
  33.  33 
  34.  34    private JTextField portTxt = null;  
  35.  35 
  36.  36    private JButton portSetBtn = null;  
  37.  37 
  38.  38    private String port = null;  
  39.  39 
  40.  40    private JButton startBtn = null;  
  41.  41 
  42.  42    private JButton stopBtn = null;  
  43.  43 
  44.  44    private JPanel mainPanle = null;  
  45.  45 
  46.  46    private JPanel headPanle = null;  
  47.  47 
  48.  48    public static void main(String[] args)  
  49.  49    {  
  50.  50        new Server();  
  51.  51    }  
  52.  52 
  53.  53    public Server()  
  54.  54    {  
  55.  55        headPanle = new JPanel(new FlowLayout(FlowLayout.LEFT));  
  56.  56        portLbl = new JLabel("PORT");  
  57.  57        portTxt = new JTextField(7);  
  58.  58        portSetBtn = new JButton("OK");  
  59.  59        portSetBtn.addActionListener(new ActionListener()  
  60.  60        {  
  61.  61            public void actionPerformed(ActionEvent e)  
  62.  62            {  
  63.  63                if (portTxt.getText().matches("\\d+"))  
  64.  64                {  
  65.  65                    port = portTxt.getText();  
  66.  66                    startBtn.setEnabled(true);  
  67.  67                    stopBtn.setEnabled(true);  
  68.  68                }  
  69.  69                else 
  70.  70                {  
  71.  71                    javax.swing.JOptionPane.showMessageDialog(null"port be inputted is illegal");  
  72.  72                }  
  73.  73            }  
  74.  74        });  
  75.  75        headPanle.add(portLbl);  
  76.  76        headPanle.add(portTxt);  
  77.  77        headPanle.add(portSetBtn);  
  78.  78        getContentPane().add(headPanle, BorderLayout.NORTH);  
  79.  79        startBtn = new JButton("Start");  
  80.  80        stopBtn = new JButton("Stop");  
  81.  81        startBtn.setEnabled(false);  
  82.  82        stopBtn.setEnabled(false);  
  83.  83        mainPanle = new JPanel(new FlowLayout(FlowLayout.CENTER));  
  84.  84        startBtn.addActionListener(new StartClickListener());  
  85.  85 
  86.  86        stopBtn.addActionListener(new ActionListener()  
  87.  87        {  
  88.  88            public void actionPerformed(ActionEvent e)  
  89.  89            {  
  90.  90                started = false;  
  91.  91                clientList.clear();  
  92.  92                try 
  93.  93                {  
  94.  94                    if (ss != null)  
  95.  95                    {  
  96.  96                        ss.close();  
  97.  97                    }  
  98.  98                }  
  99.  99                catch(IOException e1)  
  100. 100                {  
  101. 101                    e1.printStackTrace();  
  102. 102                }  
  103. 103            }  
  104. 104        });  
  105. 105        mainPanle.add(startBtn);  
  106. 106        mainPanle.add(stopBtn);  
  107. 107        getContentPane().add(mainPanle, BorderLayout.CENTER);  
  108. 108 
  109. 109        addWindowListener(new WindowAdapter()  
  110. 110        {  
  111. 111            public void windowClosing(WindowEvent e)  
  112. 112            {  
  113. 113                started = false;  
  114. 114                clientList.clear();  
  115. 115                try 
  116. 116                {  
  117. 117                    if (ss != null)  
  118. 118                    {  
  119. 119                        ss.close();  
  120. 120                    }  
  121. 121                }  
  122. 122                catch(IOException e1)  
  123. 123                {  
  124. 124                    e1.printStackTrace();  
  125. 125                }  
  126. 126                System.exit(0);  
  127. 127            }  
  128. 128        });  
  129. 129 
  130. 130        this.setSize(300300);  
  131. 131        setLocation(100100);  
  132. 132        pack();  
  133. 133        setVisible(true);  
  134. 134    }  
  135. 135 
  136. 136    private void start()  
  137. 137    {  
  138. 138        try 
  139. 139        {  
  140. 140            ss = new ServerSocket(Integer.parseInt(port));  
  141. 141            started = true;  
  142. 142        }  
  143. 143        catch(BindException be)  
  144. 144        {  
  145. 145            javax.swing.JOptionPane.showMessageDialog(null"port is useing by others");  
  146. 146        }  
  147. 147        catch(IOException e)  
  148. 148        {  
  149. 149            javax.swing.JOptionPane.showMessageDialog(null"connect server fail");  
  150. 150        }  
  151. 151        try 
  152. 152        {  
  153. 153            while(started)  
  154. 154            {  
  155. 155                Socket s = ss.accept();  
  156. 156                ClientImpl cr = new ClientImpl(s);  
  157. 157                new Thread(cr).start();  
  158. 158                clientList.add(cr);  
  159. 159                System.out.println("System Info:" + s.getInetAddress() + "connect successfully");  
  160. 160            }  
  161. 161        }  
  162. 162        catch(IOException e)  
  163. 163        {  
  164. 164            System.out.println("Client closed!");  
  165. 165        }  
  166. 166    }  
  167. 167 
  168. 168    class ClientImpl implements Runnable  
  169. 169    {  
  170. 170        private Socket s;  
  171. 171 
  172. 172        private DataInputStream dis = null;  
  173. 173 
  174. 174        private DataOutputStream dos = null;  
  175. 175 
  176. 176        boolean bConnect = false;  
  177. 177 
  178. 178        public ClientImpl(Socket s)  
  179. 179        {  
  180. 180            this.s = s;  
  181. 181            try 
  182. 182            {  
  183. 183                dis = new DataInputStream(s.getInputStream());  
  184. 184                dos = new DataOutputStream(s.getOutputStream());  
  185. 185                bConnect = true;  
  186. 186            }  
  187. 187            catch(IOException e)  
  188. 188            {  
  189. 189                e.printStackTrace();  
  190. 190            }  
  191. 191        }  
  192. 192 
  193. 193        private void send(String str)  
  194. 194        {  
  195. 195            try 
  196. 196            {  
  197. 197                dos.writeUTF(str);  
  198. 198            }  
  199. 199            catch(IOException e)  
  200. 200            {  
  201. 201                e.printStackTrace();  
  202. 202            }  
  203. 203 
  204. 204        }  
  205. 205 
  206. 206        public void run()  
  207. 207        {  
  208. 208            ClientImpl cr = null;  
  209. 209            try 
  210. 210            {  
  211. 211                while(bConnect)  
  212. 212                {  
  213. 213                    String str = dis.readUTF();  
  214. 214                    System.out.println(str);  
  215. 215                    for(int i = 0; i < clientList.size(); i++)  
  216. 216                    {  
  217. 217                        cr = (ClientImpl) clientList.get(i);  
  218. 218                        cr.send(str);  
  219. 219                    }  
  220. 220                }  
  221. 221            }  
  222. 222            catch(Exception e)  
  223. 223            {  
  224. 224                clientList.remove(cr);  
  225. 225                System.out.println(s.getInetAddress() + "has leaved");  
  226. 226            }  
  227. 227            finally 
  228. 228            {  
  229. 229                try 
  230. 230                {  
  231. 231                    if (dis != null)  
  232. 232                        dis.close();  
  233. 233                    if (dos != null)  
  234. 234                        dos.close();  
  235. 235                    if (s != null)  
  236. 236                    {  
  237. 237                        s.close();  
  238. 238                        s = null;  
  239. 239                    }  
  240. 240                }  
  241. 241                catch(IOException io)  
  242. 242                {  
  243. 243                    io.printStackTrace();  
  244. 244                }  
  245. 245            }  
  246. 246        }  
  247. 247    }  
  248. 248 
  249. 249    class StartClickListener implements Runnable, ActionListener  
  250. 250    {  
  251. 251        public void actionPerformed(ActionEvent e)  
  252. 252        {  
  253. 253            new Thread(this).start();  
  254. 254        }  
  255. 255 
  256. 256        public void run()  
  257. 257        {  
  258. 258            start();  
  259. 259        }  
  260. 260    }  
  261. 261}  

 

客户端代码:
 

 

  1.  1package com.test.talk;  
  2.   2 
  3.   3import java.awt.BorderLayout;  
  4.   4import java.awt.FlowLayout;  
  5.   5import java.awt.event.ActionEvent;  
  6.   6import java.awt.event.ActionListener;  
  7.   7import java.awt.event.WindowAdapter;  
  8.   8import java.awt.event.WindowEvent;  
  9.   9import java.io.DataInputStream;  
  10.  10import java.io.DataOutputStream;  
  11.  11import java.io.IOException;  
  12.  12import java.net.Socket;  
  13.  13import java.net.UnknownHostException;  
  14.  14 
  15.  15import javax.swing.JButton;  
  16.  16import javax.swing.JFrame;  
  17.  17import javax.swing.JLabel;  
  18.  18import javax.swing.JPanel;  
  19.  19import javax.swing.JTextArea;  
  20.  20import javax.swing.JTextField;  
  21.  21 
  22.  22/** *//**  
  23.  23 * Client  
  24.  24 *   
  25.  25 * @author hx0272  
  26.  26 *   
  27.  27 */ 
  28.  28public class Client  
  29.  29{  
  30.  30    public static void main(String[] args)  
  31.  31    {  
  32.  32        ClientFrame frame = new ClientFrame();  
  33.  33    }  
  34.  34}  
  35.  35 
  36.  36class ClientFrame extends JFrame  
  37.  37{  
  38.  38    private JPanel mainPanel;  
  39.  39 
  40.  40    private JPanel headPanel;  
  41.  41 
  42.  42    private JPanel footPanel;  
  43.  43 
  44.  44    private JTextArea showArea;  
  45.  45 
  46.  46    private JTextField inputTxt;  
  47.  47 
  48.  48    private JLabel portLbl;  
  49.  49 
  50.  50    private JLabel ipLbl;  
  51.  51 
  52.  52    private JLabel nameLbl;  
  53.  53 
  54.  54    private JTextField portTxt;  
  55.  55 
  56.  56    private JTextField ipTxt;  
  57.  57 
  58.  58    private JTextField nameTxt;  
  59.  59 
  60.  60    private JButton submitBtn;  
  61.  61 
  62.  62    private JButton nameBtn;  
  63.  63 
  64.  64    private JButton loginBtn;  
  65.  65 
  66.  66    private Socket clientSocket = null;  
  67.  67 
  68.  68    private DataOutputStream dos = null;  
  69.  69 
  70.  70    private DataInputStream dis = null;  
  71.  71 
  72.  72    private boolean bConnect = false;  
  73.  73 
  74.  74    private String name = "";  
  75.  75 
  76.  76    public ClientFrame()  
  77.  77    {  
  78.  78        init();  
  79.  79    }  
  80.  80 
  81.  81    private void init()  
  82.  82    {  
  83.  83        //main panel Begin  
  84.  84        mainPanel = new JPanel();  
  85.  85        showArea = new JTextArea(1580);  
  86.  86        showArea.setEditable(false);  
  87.  87        mainPanel.add(showArea);  
  88.  88        getContentPane().add(mainPanel, BorderLayout.CENTER);  
  89.  89        //main panel End  
  90.  90 
  91.  91        //head panel Begin  
  92.  92        headPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));  
  93.  93        portLbl = new JLabel("PORT");  
  94.  94        portTxt = new JTextField(7);  
  95.  95        ipLbl = new JLabel("IP");  
  96.  96        ipTxt = new JTextField(25);  
  97.  97 
  98.  98        nameLbl = new JLabel("name");  
  99.  99 
  100. 100        nameTxt = new JTextField(15);  
  101. 101 
  102. 102        nameBtn = new JButton("OK");  
  103. 103 
  104. 104        loginBtn = new JButton("login");  
  105. 105        nameBtn.addActionListener(new ActionListener()  
  106. 106        {  
  107. 107            public void actionPerformed(ActionEvent e)  
  108. 108            {  
  109. 109                String tmp = nameTxt.getText();  
  110. 110                if (tmp != null || !tmp.equals(""))  
  111. 111                {  
  112. 112                    int id = javax.swing.JOptionPane.showConfirmDialog(null"yes or no""choose yes",  
  113. 113                            javax.swing.JOptionPane.OK_OPTION);  
  114. 114                    if (id == 0)  
  115. 115                    {  
  116. 116                        name = nameTxt.getText();  
  117. 117                        loginBtn.setEnabled(true);  
  118. 118                        nameBtn.setEnabled(false);  
  119. 119                    }  
  120. 120                }  
  121. 121            }  
  122. 122        });  
  123. 123        headPanel.add(portLbl);  
  124. 124        headPanel.add(portTxt);  
  125. 125        headPanel.add(ipLbl);  
  126. 126        headPanel.add(ipTxt);  
  127. 127 
  128. 128        headPanel.add(loginBtn);  
  129. 129        headPanel.add(nameLbl);  
  130. 130        headPanel.add(nameTxt);  
  131. 131        headPanel.add(nameBtn);  
  132. 132        loginBtn.setEnabled(false);  
  133. 133        loginBtn.addActionListener(new ButtonClickAction());  
  134. 134        getContentPane().add(headPanel, BorderLayout.NORTH);  
  135. 135        //head panel End  
  136. 136 
  137. 137        //foot panel Begin  
  138. 138        footPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));  
  139. 139        inputTxt = new JTextField(70);  
  140. 140        submitBtn = new JButton("submit");  
  141. 141 
  142. 142        footPanel.add(inputTxt);  
  143. 143        footPanel.add(submitBtn);  
  144. 144 
  145. 145        submitBtn.addActionListener(new ButtonClickAction());  
  146. 146        submitBtn.setEnabled(false);  
  147. 147        getContentPane().add(footPanel, BorderLayout.SOUTH);  
  148. 148        //foot panel End  
  149. 149 
  150. 150        addWindowListener(new WindowAdapter()  
  151. 151        {  
  152. 152            public void windowClosing(WindowEvent e)  
  153. 153            {  
  154. 154                disConnect();  
  155. 155                System.exit(0);  
  156. 156            }  
  157. 157        });  
  158. 158 
  159. 159        this.setSize(300300);  
  160. 160        setLocation(100100);  
  161. 161        pack();  
  162. 162        setVisible(true);  
  163. 163    }  
  164. 164 
  165. 165    /** *//**  
  166. 166     * login button / submit button action listener  
  167. 167     *   
  168. 168     * @author hx0272  
  169. 169     *   
  170. 170     */ 
  171. 171    class ButtonClickAction implements ActionListener  
  172. 172    {  
  173. 173        public void actionPerformed(ActionEvent e)  
  174. 174        {  
  175. 175            if ("submit".equals(e.getActionCommand()))  
  176. 176            {  
  177. 177                String str = inputTxt.getText().trim();  
  178. 178                inputTxt.setText("");  
  179. 179                sendToServer(str);  
  180. 180            }  
  181. 181            else if ("login".equals(e.getActionCommand()))  
  182. 182            {  
  183. 183                connect();  
  184. 184            }  
  185. 185        }  
  186. 186    }  
  187. 187 
  188. 188    /** *//**  
  189. 189     * enter be inputted event  
  190. 190     *   
  191. 191     * @author hx0272  
  192. 192     */ 
  193. 193    class EnterClickAction implements ActionListener  
  194. 194    {  
  195. 195        public void actionPerformed(ActionEvent e)  
  196. 196        {  
  197. 197            String str = inputTxt.getText().trim();  
  198. 198            inputTxt.setText("");  
  199. 199            sendToServer(str);  
  200. 200        }  
  201. 201    }  
  202. 202 
  203. 203    /** *//**  
  204. 204     * send message to server  
  205. 205     *   
  206. 206     * @author hx0272  
  207. 207     */ 
  208. 208    private void sendToServer(String str)  
  209. 209    {  
  210. 210        try 
  211. 211        {  
  212. 212            dos.writeUTF(name + ":" + str);  
  213. 213            dos.flush();  
  214. 214        }  
  215. 215        catch(IOException e)  
  216. 216        {  
  217. 217            e.printStackTrace();  
  218. 218        }  
  219. 219    }  
  220. 220 
  221. 221    /** *//**  
  222. 222     * close resource  
  223. 223     *   
  224. 224     * @author hx0272  
  225. 225     */ 
  226. 226    private void disConnect()  
  227. 227    {  
  228. 228        try 
  229. 229        {  
  230. 230            // clientSocket.close();  
  231. 231            //            
  232. 232            // dos.close();  
  233. 233 
  234. 234            bConnect = false;  
  235. 235        }  
  236. 236        catch(Exception e)  
  237. 237        {  
  238. 238            e.printStackTrace();  
  239. 239        }  
  240. 240    }  
  241. 241 
  242. 242    /** *//**  
  243. 243     * receive message from server  
  244. 244     *   
  245. 245     * @author hx0272  
  246. 246     */ 
  247. 247    private class Receive implements Runnable  
  248. 248    {  
  249. 249        public void run()  
  250. 250        {  
  251. 251            try 
  252. 252            {  
  253. 253                while(bConnect)  
  254. 254                {  
  255. 255                    String str = dis.readUTF();  
  256. 256                    showArea.setText(showArea.getText() + str + '\n');  
  257. 257                }  
  258. 258            }  
  259. 259            catch(IOException e)  
  260. 260            {  
  261. 261                javax.swing.JOptionPane.showMessageDialog(null"connect server error");  
  262. 262            }  
  263. 263 
  264. 264        }  
  265. 265    }  
  266. 266 
  267. 267    /** *//**  
  268. 268     * connection begin  
  269. 269     *   
  270. 270     * @author hx0272  
  271. 271     */ 
  272. 272    private void connect()  
  273. 273    {  
  274. 274        try 
  275. 275        {  
  276. 276            if (ipTxt.getText().matches("\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}") && portTxt.getText().matches("\\d+"))  
  277. 277            {  
  278. 278                clientSocket = new Socket(ipTxt.getText(), Integer.parseInt(portTxt.getText()));  
  279. 279                dos = new DataOutputStream(clientSocket.getOutputStream());  
  280. 280                dis = new DataInputStream(clientSocket.getInputStream());  
  281. 281                bConnect = true;  
  282. 282                new Thread(new Receive()).start();  
  283. 283                System.out.println("I am coming");  
  284. 284                javax.swing.JOptionPane.showMessageDialog(null"connect server success");  
  285. 285                submitBtn.setEnabled(true);  
  286. 286                inputTxt.addActionListener(new EnterClickAction());  
  287. 287            }  
  288. 288            else 
  289. 289            {  
  290. 290                javax.swing.JOptionPane.showMessageDialog(null"port or ip be inputted is illegal");  
  291. 291            }  
  292. 292        }  
  293. 293        catch(UnknownHostException uhe)  
  294. 294        {  
  295. 295            javax.swing.JOptionPane.showMessageDialog(null"connect server error");  
  296. 296        }  
  297. 297        catch(IOException e)  
  298. 298        {  
  299. 299            javax.swing.JOptionPane.showMessageDialog(null"connect server error");  
  300. 300        }  
  301. 301    }  
  302. 302}  
  303. 303 

 使用说明:
1.先运行服务器端程序,设定好端口号
2.点击Start按钮,运行服务器
3.运行客户端程序
4.设定好昵称
5.设定与服务器端匹配的端口号和服务器的ip地址
6.点击Login按钮,登录到聊天系统
7.可以聊天了。
 



本文地址 : http://www.fengfly.com/plus/view-191011-1.html
标签: java Socket Swing 聊天程序
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: