日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
JavaNIO聊天窗口實例

一、服務器

 
 
 
  1. package com.ww.server;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.nio.ByteBuffer;
  5. import java.nio.channels.SelectionKey;
  6. import java.nio.channels.Selector;
  7. import java.nio.channels.ServerSocketChannel;
  8. import java.nio.channels.SocketChannel;
  9. import java.text.SimpleDateFormat;
  10. import java.util.Date;
  11. import java.util.Iterator;
  12. import java.util.List;
  13. import java.util.Vector;
  14. import com.ww.dao.UsersData;
  15. import com.ww.entity.Users;
  16. public class Server implements Runnable{
  17.     
  18.     //選擇器
  19.     private Selector selector;
  20.     
  21.     //選擇key
  22.     private SelectionKey sscKey;
  23.     
  24.     //服務器開關
  25.     private boolean isOpen;
  26.     
  27.     //用戶集合
  28.     private List users;
  29.     
  30.     //用戶上線列表
  31.     private Vector userNames;
  32.     
  33.     public Server(int port)
  34.     {
  35.         isOpen = true;
  36.         users = UsersData.dataUsers();
  37.         userNames = new Vector();
  38.         init(port);
  39.     }
  40.     
  41.     
  42.     @Override
  43.     public void run() 
  44.     {
  45.         try {
  46.             while(isOpen)
  47.             {
  48.                 //接收信息的數(shù)量
  49.                 int result = selector.select();
  50.                 if(result > 0)
  51.                 {
  52.                     for (Iterator iterator = selector.selectedKeys().iterator(); iterator.hasNext();) 
  53.                     {
  54.                         SelectionKey key = (SelectionKey) iterator.next();
  55.                         iterator.remove();
  56.                         //判斷是否是接收狀態(tài)
  57.                         if(key.isAcceptable())
  58.                         {
  59.                             System.out.println("==========客戶端開啟==========");
  60.                             getConn(key);
  61.                         }
  62.                         //判斷是否是讀取狀態(tài)
  63.                         else if(key.isReadable())
  64.                         {
  65.                             System.out.println("=============讀取=============");
  66.                             ReadMsg(key);
  67.                         }
  68.                         //判斷是否是寫入狀態(tài)
  69.                         else if(key.isWritable())
  70.                         {
  71.                             System.out.println("=============寫入=============");
  72.                             WriteMsg(key);
  73.                         }
  74.                         
  75.                     }
  76.                 }
  77.                 
  78.             }
  79.         } catch (IOException e) {
  80.             e.printStackTrace();
  81.         }
  82.     }
  83.     //初始化服務器
  84.     private void init(int port)
  85.     {
  86.         try {
  87.             //開啟選擇器
  88.             selector = Selector.open();
  89.             //開啟ServerSocket
  90.             ServerSocketChannel ssc = ServerSocketChannel.open();
  91.             //設置非阻塞模式
  92.             ssc.configureBlocking(false);
  93.             //設置端口
  94.             ssc.socket().bind(new InetSocketAddress(port));
  95.             //注冊到選擇器里并設置為接收狀態(tài)
  96.             sscKey = ssc.register(selector,SelectionKey.OP_ACCEPT);
  97.             System.out.println("==========開啟服務器==========");
  98.             
  99.         } catch (IOException e) {
  100.             e.printStackTrace();
  101.         }
  102.     }
  103.     
  104.     //獲取連接
  105.     private void getConn(SelectionKey key) throws IOException
  106.     {
  107.         //獲取ServerSocket
  108.         ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
  109.         //設置Socket
  110.         SocketChannel sc = ssc.accept();
  111.         //設置非阻塞模式
  112.         sc.configureBlocking(false);
  113.         //注冊到選擇器里并設置為讀取狀態(tài)
  114.         sc.register(selector, SelectionKey.OP_READ);
  115.     }
  116.     
  117.     //讀取信息
  118.     private void ReadMsg(SelectionKey key) throws IOException
  119.     {
  120.         //獲取到Socket
  121.         SocketChannel sc = (SocketChannel)key.channel();
  122.         ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024);
  123.         buffer.clear();
  124.         StringBuffer sb = new StringBuffer();
  125.         //獲取字節(jié)長度
  126.         int count = sc.read(buffer);
  127.         if( count > 0 )
  128.         {
  129.             buffer.flip();
  130.             sb.append(new String(buffer.array(), 0, count));
  131.         }
  132.         Object obj = (Object)sb.toString();
  133.         if(obj.toString().indexOf("-")!= -1)
  134.         {
  135.             //獲取用戶名
  136.             String userName = obj.toString().substring(0, obj.toString().indexOf("-"));
  137.             //獲取用戶密碼
  138.             String userPass = obj.toString().substring(obj.toString().indexOf("-") + 1);
  139.             
  140.             boolean isTrue = false;
  141.             //判斷用戶是否存在
  142.             for (int i = 0; i < users.size(); i++) {
  143.                 if(users.get(i).getUserName().equals(userName) && users.get(i).getUserPass().equals(userPass))
  144.                 {
  145.                     System.out.println("========" + userName + "登錄成功========");
  146.                     isTrue = true;
  147.                     userNames.addElement(userName);
  148.                     KeyAttach(key,"true");
  149.                     break;
  150.                 }
  151.                 isTrue = false;
  152.             }
  153.             
  154.             //用戶不存在
  155.             if(!isTrue)
  156.             {
  157.                 System.out.println("========" + userName + "登錄失敗========");
  158.                 KeyAttach(key,"false");
  159.             }
  160.         }
  161.         else if(obj.toString().equals("open"))
  162.         {
  163.             System.out.println("=========開啟聊天窗口=========");
  164.             //給都有的用戶返回用戶列表
  165.             AllKeysAttach(key,userNames);
  166.         }
  167.         else if( obj.toString().indexOf("exit_") != -1 )
  168.         {
  169.             String userName = obj.toString().substring(5);
  170.             userNames.removeElement(userName);
  171.             System.out.println("========" + userName + "退出窗體========");
  172.             KeyAttach(key,"close");
  173.             OtherKeysAttach(key,userNames);
  174.         }
  175.         else
  176.         {
  177.             //獲取用戶名
  178.             String userName = obj.toString().substring(0,obj.toString().indexOf("^"));
  179.             //獲取信息
  180.             String mess = obj.toString().substring(obj.toString().indexOf("^")+1);
  181.             //獲取發(fā)信時間
  182.             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  183.             String dateTime = dateFormat.format(new Date());
  184.             //設置信息
  185.             String mss = userName + " " + dateTime + "\n" + mess + "\n";
  186.             //給都有的用戶返回聊天信息
  187.             AllKeysAttach(key,mss);
  188.         }
  189.         
  190.     }
  191.     
  192.     //所有client改成寫入狀態(tài)
  193.     private void AllKeysAttach(SelectionKey key,Object obj)
  194.     {
  195.         for (Iterator iterator = key.selector().keys().iterator(); iterator.hasNext();) 
  196.         {
  197.             SelectionKey selKey = (SelectionKey) iterator.next();
  198.             //判斷不是Server key;
  199.             if( selKey != sscKey )
  200.             {
  201.                 selKey.attach(obj);
  202.                 //把其他client改成可寫狀態(tài)
  203.                 selKey.interestOps( selKey.interestOps() | SelectionKey.OP_WRITE );
  204.             }
  205.         }
  206.     }
  207.     
  208.     //把其他客戶改成寫入狀態(tài)
  209.     private void OtherKeysAttach(SelectionKey key,Object obj)
  210.     {
  211.         for (Iterator iterator = key.selector().keys().iterator(); iterator.hasNext();) 
  212.         {
  213.             SelectionKey selKey = (SelectionKey) iterator.next();
  214.             //判斷不是本生client key和Server key;
  215.             if( selKey != sscKey && selKey != key )
  216.             {
  217.                 selKey.attach(obj);
  218.                 //把其他client改成可寫狀態(tài)
  219.                 selKey.interestOps( selKey.interestOps() | SelectionKey.OP_WRITE );
  220.             }
  221.         }
  222.     }
  223.     
  224.     //自身改成寫入狀態(tài)
  225.     private void KeyAttach(SelectionKey key,Object obj)
  226.     {
  227.         key.attach(obj);
  228.         key.interestOps(SelectionKey.OP_WRITE);
  229.     }
  230.     
  231.     //發(fā)送信息
  232.     private void WriteMsg(SelectionKey key) throws IOException
  233.     {
  234.         //獲取到Socket
  235.         SocketChannel sc = (SocketChannel)key.channel();
  236.         //獲取附屬值
  237.         Object obj = key.attachment();
  238.         //把附屬值設為空
  239.         key.attach("");
  240.         //發(fā)送信息
  241.         sc.write(ByteBuffer.wrap(obj.toString().getBytes()));
  242.         if(obj.toString().equals("close") || obj.toString().equals("false"))
  243.         {
  244.             key.cancel();
  245.             sc.socket().close();
  246.             sc.close();
  247.             System.out.println("==========客戶端關閉==========");
  248.             return;
  249.         }
  250.         //設置為讀取狀態(tài)
  251.         key.interestOps(SelectionKey.OP_READ);
  252.     }
  253.     
  254.     public static void main(String[] args) 
  255.     {   
  256.         Server server = new Server(8001);
  257.         new Thread(server).start();
  258.     }
  259. }

二、客戶端界面

1.登錄界面

 
 
 
  1. package com.ww.frame;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.WindowAdapter;
  7. import java.awt.event.WindowEvent;
  8. import java.io.IOException;
  9. import javax.swing.JButton;
  10. import javax.swing.JFrame;
  11. import javax.swing.JLabel;
  12. import javax.swing.JTextField;
  13. import com.ww.biz.ClientServerBIz;
  14. import com.ww.frame.ChatFrame;
  15. public class LoginFrame {
  16.     
  17.     private JLabel 
  18.         lblTitle = new JLabel("山寨版QQ"),
  19.         lblUserName = new JLabel("用戶名:"),
  20.         lblPassword = new JLabel("密     碼:");
  21.     
  22.     private JTextField 
  23.         txtUserName = new JTextField(15),
  24.         txtPassword = new JTextField(15);
  25.     
  26.     private JButton
  27.         btnSub = new JButton("提交"),
  28.         btnRes = new JButton("取消");
  29.     
  30.     private JFrame
  31.         aFrame = new JFrame("登錄山寨QQ");
  32.     
  33.     private ClientServerBIz clientBiz;
  34.     public LoginFrame()
  35.     {
  36.         into();
  37.     }
  38.     
  39.     private void into()
  40.     {
  41.         aFrame.setLayout(null);
  42.         aFrame.setBounds(300, 300, 200, 180);
  43.         lblTitle.setBounds(45, 10, 100, 40);
  44.         lblTitle.setForeground(new Color(120, 120, 120));
  45.         lblTitle.setFont(new Font("山寨版QQ", 1, 20));
  46.         aFrame.add(lblTitle);
  47.         lblUserName.setBounds(10, 50, 80, 20);
  48.         aFrame.add(lblUserName);
  49.         lblPassword.setBounds(10, 80, 80, 20);
  50.         aFrame.add(lblPassword);
  51.         txtUserName.setBounds(65, 50, 120, 20);
  52.         aFrame.add(txtUserName);
  53.         txtPassword.setBounds(65, 80, 120, 20);
  54.         aFrame.add(txtPassword);
  55.         btnSub.setBounds(10, 110, 80, 25);
  56.         aFrame.add(btnSub);
  57.         btnRes.setBounds(100, 110, 80, 25);
  58.         aFrame.add(btnRes);
  59.         
  60.         btnSub.addActionListener(new ActionListener() {
  61.             @Override
  62.             public void actionPerformed(ActionEvent e) {
  63.                 String userInfo = txtUserName.getText() + "-" + txtPassword.getText();
  64.                 try {
  65.                     clientBiz = new ClientServerBIz();
  66.                     clientBiz.sendToServer(userInfo);
  67.                     Object obj = clientBiz.sendToClient();
  68.                     System.out.println(obj.toString());
  69.                     if (Boolean.parseBoolean(obj.toString()))
  70.                     {
  71.                         ChatFrame cf = new ChatFrame(clientBiz,txtUserName.getText());
  72.                         cf.show();
  73.                         aFrame.setVisible(false);
  74.                     }
  75.                     else
  76.                     {
  77.                         System.out.println("用戶不存在或密碼錯誤!");
  78.                     }
  79.                 } catch (IOException e1) {
  80.                     e1.printStackTrace();
  81.                 } catch (ClassNotFoundException e1) {
  82.                     e1.printStackTrace();
  83.                 }
  84.             }
  85.         });
  86.         
  87.         btnRes.addActionListener(new ActionListener() {
  88.             @Override
  89.             public void actionPerformed(ActionEvent e) {
  90.                 System.exit(0);
  91.             }
  92.         });
  93.         
  94.         aFrame.addWindowListener(new WindowAdapter() {
  95.             @Override
  96.             public void windowClosing(WindowEvent e) {
  97.                 System.exit(0);
  98.             }   
  99.         });
  100.     }
  101.     
  102.     public void show()
  103.     {
  104.         aFrame.setVisible(true);
  105.     } 
  106.     
  107.     public static void main(String[] args) {
  108.         LoginFrame login = new LoginFrame();
  109.         login.show();
  110.     }
  111. }

2.聊天界面

 
 
 
  1. package com.ww.frame;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.awt.event.WindowAdapter;
  5. import java.awt.event.WindowEvent;
  6. import java.io.IOException;
  7. import javax.swing.DefaultListModel;
  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;
  10. import javax.swing.JList;
  11. import javax.swing.JOptionPane;
  12. import javax.swing.JTextArea;
  13. import javax.swing.event.ListSelectionEvent;
  14. import javax.swing.event.ListSelectionListener;
  15. import com.ww.biz.ClientServerBIz;
  16. public class ChatFrame {
  17.     
  18.     //文本框
  19.     private JTextArea
  20.         readContext = new JTextArea(18,30),//顯示信息
  21.         writeContext = new JTextArea(6,30);//發(fā)送信息
  22.     
  23.     //列表框
  24.     private DefaultListModel modle = new DefaultListModel();//列表模型
  25.     private JList list = new JList(modle);//列表
  26.     
  27.     //按鈕
  28.     private JButton 
  29.         btnSub = new JButton("提交"),//提交按鈕
  30.         btnRes = new JButton("取消");//取消按鈕
  31.     
  32.     //窗體界面
  33.     private JFrame aFrame = new JFrame("ChatFrame");
  34.     
  35.     //用戶名
  36.     private String userName;
  37.     
  38.     //Client業(yè)務類
  39.     private ClientServerBIz userBiz;
  40.     
  41.     //設置線程是否運行
  42.     private boolean isConntext = false;
  43.     
  44.     //構造方法
  45.     public ChatFrame(ClientServerBIz clientBiz,String userName)
  46.     {
  47.         //獲取用戶名
  48.         this.userName = userName;
  49.         userBiz = clientBiz;
  50.         //開啟線程
  51.         isConntext = true;
  52.         new Thread(new ctUsers()).start();  
  53.     }
  54.     
  55.     //初始化界面
  56.     private void init() throws IOException, ClassNotFoundException
  57.     {
  58.         aFrame.setLayout(null);
  59.         aFrame.setTitle(userName+" 聊天窗口");
  60.         aFrame.setSize(500, 500);
  61.         aFrame.setLocation(400, 200);
  62.         readContext.setBounds(10, 10, 320, 285);
  63.         readContext.setEditable(false);
  64.         writeContext.setBounds(10, 305, 320, 100);
  65.         list.setBounds(340, 10, 140, 445);
  66.         aFrame.add(readContext);
  67.         aFrame.add(writeContext);
  68.         aFrame.add(list);
  69.         btnSub.setBounds(150, 415, 80, 30);
  70.         btnRes.setBounds(250, 415, 80, 30);
  71.         
  72.         //frame的關閉按鈕事件
  73.         aFrame.addWindowListener(new WindowAdapter() {
  74.             @Override
  75.             public void windowClosing(WindowEvent e) {
  76.                 isConntext = false;
  77.                 //發(fā)送關閉信息
  78.                 userBiz.sendToServer("exit_" + userName);
  79.                 System.exit(0);
  80.             }
  81.         });
  82.         //提交按鈕事件
  83.         btnSub.addActionListener(new ActionListener() {
  84.             @Override
  85.             public void actionPerformed(ActionEvent e) {
  86.                 //發(fā)送信息
  87.                 userBiz.sendToServer(userName + "^" 新聞標題:JavaNIO聊天窗口實例
    網站網址:http://www.dlmjj.cn/article/coophpo.html