java学习视频 Gradle algorithm encryption keras threejs permissions react router vue状态管理 android经典项目开发实战 java商城源码 小程序demo源码 jq触发点击事件 jq遍历 jq获取第一个子元素 idea整理代码格式 pip环境变量 mac版的matlab好用吗 汇编语言clr pythonsocket编程 mysqlinsert python3正则表达式 python建站 java获取当前月 linux云服务器 电脑密码查看器 win10有哪些版本 js小数点保留2位 还原软件哪个好 小米8游戏模式 sendto函数 cad2008汉化包 优酷app播放器下载 js对象转字符串 清华天河 ps取色 调试工具 只狼月隐糖 ps颜色查找 img转iso
当前位置: 首页 > 学习教程  > 编程语言

使用NIO实现非阻塞式(相对的)多人聊天室

2020/8/11 19:50:20 文章标签:

1.服务端

package d02_test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

/**
 * zt
 * 2020/8/11
 * 18:02
 */
public class Server {
    public static void main(String[] args) {
        //1.创建ServerSockChannel
        ServerSocketChannel listener = null;
        try {
            listener = ServerSocketChannel.open();
            //2.绑定地址
            listener.bind(new InetSocketAddress("10.0.139.160",10086));
            //3.设置非阻塞模式
            listener.configureBlocking(false);
            //4.创建selector选择器
            Selector selector = Selector.open();
            //5.把通道注册到选择器,并指定注册事件
            listener.register(selector, SelectionKey.OP_ACCEPT);
            //6.轮询(Select()阻塞方法。没有事件发送阻塞)
            System.out.println("服务器启动.....0.0");
            while (selector.select()>0){
                //7.处理
                Set<SelectionKey> selectionKeys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = selectionKeys.iterator();
                while (iterator.hasNext()){
                    SelectionKey selectionKey = iterator.next();
                    if(selectionKey.isAcceptable()){
                        SocketChannel socketChannel = listener.accept();
                        System.out.println(socketChannel.getRemoteAddress()+"进入聊天室");
                        //设置非阻塞式模式
                        socketChannel.configureBlocking(false);
                        //注册到selector
                        socketChannel.register(selector, SelectionKey.OP_READ);
                    }else if(selectionKey.isReadable()){
                        //读取数据
                        SocketChannel channel = (SocketChannel) selectionKey.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(1024);
                        int len = 0;
                        //不会阻塞
                        try {
                            while ((len=channel.read(buffer))>0){
                                buffer.flip();
                                String data = new String(buffer.array(),0,buffer.limit());
                                System.out.println(channel.getRemoteAddress()+"说:"+data);
                                buffer.clear();
                            }
                            //开启线程回复
                            if(len==1){
                                System.out.println(channel.getRemoteAddress()+"退出 了");
                                channel.close();
                            }
                        } catch (IOException e) {
                            System.out.println(channel.getRemoteAddress()+"异常退出了");
                            channel.close();
                        }

                    }
                    //已经处理过了键删除掉
                    iterator.remove();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                listener.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

2.客户端

package d02_test;


import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Scanner;

/**
 * zt
 * 2020/8/11
 * 18:02
 */
public class Client {
    public static void main(String[] args) throws Exception {
        //1.创建socketchannel
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("10.0.139.160",10086));
        //2.设置为非阻塞模式
        socketChannel.configureBlocking(false);
        //3.控制台录入并写出
        Scanner sc = new Scanner(System.in);
        while (true){
            String data = sc.next();
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            buffer.put(data.getBytes());
            buffer.flip();
            socketChannel.write(buffer);
            buffer.clear();
            if(data.equals("886")){
                break;
            }
        }
        //关闭
        socketChannel.close();

    }
}

3.运行结果:

Server

服务器启动.....0.0
/10.0.139.160:60397进入聊天室
/10.0.139.160:60397说:呱?
/10.0.139.160:60397说:你好啊

Client

呱?
你好啊

本文链接: http://www.dtmao.cc/news_show_100223.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?