Java nio服务端对同一个消息多次select如何处理

服务端代码

        private void listen() throws IOException {
        SocketChannel client;
        while (selector.select() > 0) {
            System.out.println("select");
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectionKeys.iterator();
            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();
                //置空迭代器
                keyIterator.remove();
                try {
                    if (key.isAcceptable()) {
                        server = (ServerSocketChannel) key.channel();
                        client = server.accept();
                        client.configureBlocking(false);
                        client.register(selector,SelectionKey.OP_READ);
                    }else if (key.isReadable()) {
                        System.out.println("read");
                        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                        SocketChannel readChannel = (SocketChannel) key.channel();
                        readChannel.read(readBuffer);
                        readBuffer.flip();
                        int i = readBuffer.getInt();
                        System.out.println("输出 " +i);
                    }
                    if (key.isWritable()) {

                    }
                }catch (IOException e) {
                    key.channel().close();
                    key.cancel();
                }
            }
        }
    }

客户端代码

     ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
        writeBuffer.putInt(111);
        try {
            client.write(writeBuffer);
        } catch (IOException e) {
            e.printStackTrace();
        }

服务端输出3次select 其中一次是连接accept 一次是接收消息 还有一次呢?
另外 在另一个程序中 服务端不断地对同一个消息处理 大概6次直到报错(这个程序是持续连接 另起线程)
求助

0

1个回答

还有一次write,你服务端时刻缓冲区可写。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
对同一个表多次select, 如何缩减 select 的次数
有一个业务,给出一个 S1, 需要判断其属于哪一种情况:rnrn总共有 A/B/C 三种情况:rnrnA: 如果 NUM > 0 则符合 A 情况:rnselect count(*) NUM from Table where S1='12345'rnrnB: 如果 NUM > 0 则符合 B 情况:rnselect count(*) NUM from Table where S1='12345' and S2<>0rnrnC: 如果 NUM > 0 则符合 C 情况:rnselect count(*) NUM from Table where S1='12345' and S3='abcde'rnrn如果要获得结果(最终判断出它属于某情况)rn最坏的结果,会执行 三次 SELECT 操作(都是对同一张表 —— Table 表)rnrn现在需要优化SQL,减少select 的次数, 如何做到 用一条,(或 尽量减少 SELECT 的次数),并且能够达到:准确判断出其到底属于 哪一种情况?rn谢谢~~
如何对同一个DATATABLE进行多次筛选
如何对同一个DATATABLE进行多次筛选,请各位指点,在线等,急啊。在3点前结贴
java nio之select()问题
近阶段在学习java nio的问题,对其中的Selector类,对select()方法等一直问题多多,现有以下疑问,期待各位高手的不吝赐教。rn 1、一个Selector()最多可以注册多少个Channels呢,听同事说,unix c里面的这个是可以配置的,默认为64个。请问,java是否也有这样的一个数量大小的配置?rn 2、当一个socketchannel是可以read的时候,立即把里面的数据读出来,可是我要不关闭连接和流的话,socketchannel.read(ByteBuffer)就一直返回0,还是占用了一个线程,请问,我是否可以在读完流里面的数据后,取消掉read的注册?然后再重新注册这个socketchannel?rn 3、请问哪位有用java nio做服务端的实例?可以支持大并发量的那种?非常感谢!rn
服务端对下载文件的处理
1/可能你会遇到下载了文件但还有空白网页留在那的问题,这时候的解决方法是,在网页里面定义一个隐藏的iframe,然后href或window.open时指定target为这个iframe的名字,如: &lt;iframe name="download" style="display: none;"&gt;&lt;/iframe&gt; &lt;script&gt; function down...
JAVA NIO 异步通信模板服务端
在CMD运行模式下实现的JAVA异步通信,采用Java.nio包,使用线程实现
jvm库对nio的处理
JVM的IO选择 查JVM源码时刚好看到JVM库的一段代码: public static SelectorProvider create() { String osname = AccessController.doP...
服务端以NIO的方式处理请求的Demo
服务端以NIO的方式处理请求的Demo,源码及详细注释
关于JAVA NIO 中的select
我最近写一个机遇NIO的聊天程序,为什么我在客户段 write一次 而服务器端的selector 却分别返回两次 读事件?
如何多次读取同一个inputStream
rtrnrn请教大家了,多谢
如何多次插入同一个临时表?
我用exec(@sql)的方式向一个临时表中插入数据,但是这个语句会执行多次,第二次插入时会出现临时表已近存在的错误,这个怎么办?rnrn我的原问题是这样的,看看有没有人能够解决:rnrn我有一个表s,s中有一个字段叫做tbname,tbname字段保存了一些表结构相同的表名rnrn我会从s中选出一些数据,比如rnselect id,tbname from srn得到:rn1 tb_arn2 tb_brn3 tb_crnrntb_a,tb_b,tb_c(等)表中有一个字段s_idrnrn然后我要从tb_a中读取s_id=1的值,从tb_b中读取s_id=2的值,等等.......再把他们放在一个结果集中返回rnrn问题来了,怎么查询?rn1 s中的值可能会很多rn2 tb_name的值也有近200个可能rnrn1 如果使用拼字符串动态查询的话,那么当s中读取的值很多时会超过4000的限制rn2 如果插入临时表的话就遇到了帖子一开始的问题rn
服务端如何避免多次提交
思路:客户端和服务端在页面刚创建的时候,利用sessionId和当前系统时间生成一个类似UUID的串,设为token,服务端的为sessionToken,客户端的为pageToken,即一开始2者是相等的,然后当第一次提交完成后,将服务器端的sessionToken根据sessionId和新的时间戳生成一个新的串,而客户端一般通过后退按钮再点击或者刷新提交页面,则会造成客户端的2次提交,但此时p...
java nio 如何处理慢速的连接
为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...
对同一个数组进行多次初始化
int a[]={4,9,1,8,[0]=5,7}; Q:上述声明是否合法?若合法,数组长度是多少? A:这个声明是合法的。下面是它的工作原理:       编译器在处理初始化列表时,会记录下一个待初始化的数组元素位置。正常情况下,下一个元素是刚被初始化的元素后面的那个。但是,当列表中出现初始化式时,下一个元素会被强制为指示符对应的元素,即使该元素已经被初始化过。下面逐步分析编译器处理数组a
服务端如何接收消息
客户端用这个发送消息可以吗?如果可以,服务端如何接收啊?rnrnfunction SendInfo(Server:String;Port:integer):String;rnvarrn len,s:integer;rn name:sockaddr_in;rn he:PHostEnt;rn buf:array[0..1023]of char;rn str,data:string;rn wsd:WSADATA;rn i:integer;rnbeginrn WSAStartup($101,wsd);rn s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);rn he:=gethostbyname(PChar(Server));rn if he=nil thenrn Raise Exception.Create('使用Sock连接异常或是指定服务器有误!');rnrn FillChar(name,sizeof(name),0);rn name.sin_family:=AF_INET;rn name.sin_port:=htons(Port);rn name.sin_addr.S_addr:=PDWORD(PDWORD(he.h_addr)^)^;rn connect(s,name,sizeof(name));rn str := '123';rn send(s,PChar(str)^,Length(str),0);rnrn closesocket(s);rn WSACleanup();rn Result := data;rnend;
浅谈服务端对跨域的处理
由于这两天在做项目的时候遇到了跨域这个问题,为了加深记忆和理解所以在这里献丑谈谈自己的看法。如果有不同的声音希望大家能够拍砖指出。 1.什么是跨域 跨域是指浏览器不能执行非本域下的请求,也就是说你提交的post、get请求不是你自己的服务器域。这是浏览器的一种处于安全限制的同源策略所致,它指Ajax请求所在的页面和被请求的页面在协议、域名、端口均相同才能被访问。 例如: http://a.ba
java nio请求命令处理
在java nio无堵塞模式下 如果client请求"index.html"命令;rnIterator it=selector.selected().iterator();rnwhile(it.hasNext())rn key=(SelectionKey)it.next();rn it.remove();rn if(it.isWriteable)rn rn rn if(it.isReadable()rn 读到一个请求返回"index.html"rn 可是如何给client返回这个outputStream;rn rn
Java服务端处理音频
最近接到一个项目。Java服务端处理音频 例如一下功能: 1.音频剪切合成 2.歌曲曲风切换 将音频切换成 (摇滚,爵士,古典,等等) 3.音效设置 环绕 重低音 混响强度等等   个人想法: 找提供API的第三方软件实现音频转换 但目前没找到  找遍网络资源没发现有类似的文章,望各位大佬提供点资源或思路...
TCP服务端NIO的方式
TCP服务端NIO的方式 class ServerConnect { private static final int BUF_SIZE = 1024; private static final int PORT = 8080; private static final int TIMEOUT = 3000; public static void main(
如何对自绘的按钮添加处理消息
想学习用MFC制作用户界面,对于用OnPaint函数绘制出来的按钮,怎么添加消息处理事件,谁能帮帮忙解答下,谢谢了
NIO Socket服务端和客户端
声明:本文章仅基于个人粗略整理总结,如有不足之处,欢迎指出。 参考文章:NIO Socket编程实例、nio的简单传输例子、深入浅出NIO Socket实现机制、深入浅出NIO之Channel、Buffer ++++++++++++++++++++++++++ 上一篇:https://blog.csdn.net/u012767184/article/details/88762935 ni...
NIO客户端与服务端
客户端 class NioClient{ public static void main(String args[]) throws IOException{ System.out.println(&quot;客户端已经启动。。&quot;); // 1.创建socket通道 SocketChannel schannel = SocketChannel.op...
NIO服务端测试代码
详情查看博客地址详情查看博客地址详情查看博客地址详情查看博客地址http://blog.csdn.net/g290095142/article/details/77848088
如何多次触发WM_TIMER消息
我在做毕业设计,请各位高手帮帮忙!rn就是通过一个按钮能不能多次利用SetTimer触发WM_TIMER消息,即就是 每按一次按钮能调用其OnTimer函数,这个怎么实现?
Java NIO 之对文件锁支持
Java NIO之对文件锁支持介绍通常在我们打开一个文件时,其他用户是无法对这个文件进行修改操作的。我们可以定义不同的锁机制,来达到不同的控制。如果我们使用的是独占锁那么其他用户是无法对该文件进行读写操作的,如果我们使用的是共享锁那么其他用户可以对其进行读操作但是不能进行写操作。 在Java nio中提供了文件锁的功能,这样当一个线程将文件锁定之后,其他线程就无法操作此文件了,除非其获得锁资源。 可
多线程如何避免多次调用同一个线程对程序的影响
线程1rnrn 创建一个数组;rn 改变数组值;rn //因要将数组传递给线程2,所以数组必须是static型。rn 启动线程2,并将数组传递给线程2;rn rnrn线程2rnrn 利用数组值做一些操作;rnrnrn我的问题是:在线程2执行过程中,在线程1中再次调用线程2,rn第一次启动的数组值也会随着线程1对数组的更改而改变rnrn怎么避免这种情况呢rnrn
对JAVA NIO的使用心得
之前接触过一个项目,是tcp/ip对门禁上位机的数据监听,开始使用的是传统的Bio方式,但是由于ip数量过多,经常会出现socket连接No buffer space available的问题,导致接口大面积调用(webservice,httpclient)失败的问题,重启服务器后又恢复了正常。报错如下Caused by: java.net.SocketException: No buffer
基于Java NIO的服务端和客户端简单实现
一、服务端 (1)初始化 在服务器启动前我们需要进行一系列初始化操作,包括创建选择器、ServerSocketChannel通道、绑定端口。 下面是初始化操作: //创建选择器 Selector selector = Selector.open(); //创建通道 ServerSocketChannel ssc = ServerSocketChannel.open(); //将该通道设...
java服务端(三)NIO实现Netty框架
NIO实现Netty框架 简介:Netty就是有 看门服务员(线程+selector)是迎接客人(接受请求),点菜服务员 (线程+selector)去 处理客人的点菜等等。客人就相当于一个客户端的请求。 各个类的流程 一、主启动类流程:(Start.java) 1、创建线程池管理者: 用于管理 Boss (看门服务员) 和 Worker ...
Java NIO非阻塞服务端与客户端相互通信
Java NIO非阻塞服务端与客户端相互通信 每行代码都有注释, 看完后,会让你对非阻塞有一清楚的认识.
java服务端socket异步通信nio源码
eclipse工程 导入eclipse myeclipse就可以完美运行 有测试类 每一行都有注释 资源分定为5分,如果大家还觉得我积分定多了,那么大家可以去下载那些个单个类10积分的。 请大家也体谅我的辛苦劳作
JAVA nio异步长连接服务端与客户端
JAVA.NIO 异步长连接客户端与服务端都有,大家可以看看,另不知道怎么样将客户端读取的BUFF后的数据进行处理可以给出修改吗?
java nio 实现客户端与服务端读写
刚开始写,有待后续完善 服务端代码: package com.geng.test3; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.Selecta
java nio 实现选择器客户端,服务端
/**       * 思路:创建通信的通道-->创建缓冲区-->将要发送的数据写入缓冲区-->网络通道将缓冲区中的数据发出       */      @Test      public void clinet() throws IOException{           //1.创建网络通道           SocketChannel sChannel = Soc
js对 select 的各种处理
一、jQuery给select赋值(用text给select初始化的两种方式) (1)、$("#d_province_0" option").each(function(){   if($(this).text()==province[i]){          $(this).attr("selected","selected");          } }); (2)、   $(
MyHandler对'play'消息的处理
MyHandler对'play'消息的处理
MyHandler对消息"conn"的处理
安卓N版本MyHandler对消息”conn的处理”原文
MyHandler.h对消息"accu"的处理
安卓N版本MyHandler.h对消息”accu”的处理原文
MyHandler对消息'setu'的处理
case 'setu':
MyHandler对'desc'消息的处理
MyHandler对'desc'消息的处理
NIO(二)——SELECT
本文的行文思路是对照一个典型的例子,将select的整个IO过程捋一遍。,另外还会涉及一些平时容易忽略的知识点。概述 IO过程主要分为:1)数据准备阶段;2)数据操作阶段。所谓的阻塞非阻塞IO,主要指的都是第一个阶段。 NIO主要有三大部分:Channel,Buffer,Selector。NIO(Non-Blocking IO或New IO)是相对于BIO(Blocking IO)而言的。BIO