V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 29 页 / 共 39 页
回复总数  777
1 ... 25  26  27  28  29  30  31  32  33  34 ... 39  
2020-03-22 12:39:35 +08:00
回复了 amiwrong123 创建的主题 Java 如何理解 NIO 中 attach 以及如何正确注册 write 事件?
@az467
好吧,懂了。怪我没仔细看代码~~

所以 注册什么事件的时候,不想弄丢附件,就 sk.interestOps(sk.interestOps() | SelectionKey.OP_WRITE);呗

而想直接清空附件,就 socketChannel.register(selector, SelectionKey.OP_WRITE);呗

也不所谓哪种是正确的
2020-03-22 12:19:40 +08:00
回复了 amiwrong123 创建的主题 Java 如何理解 NIO 中 attach 以及如何正确注册 write 事件?
@az467
纳尼,这怎么说,看文档也没看出有这个意思啊。注册 读 或 写 表现还不一样昂
2020-03-22 11:59:23 +08:00
回复了 amiwrong123 创建的主题 Java 如何理解 NIO 中 attach 以及如何正确注册 write 事件?
@az467
好吧,大概懂了。等会我再去仔细看文档。
但有个地方没想通,就是第二种运行效果,为啥
```
selector 4th loop, ready event number is 1
服务端有 READ 事件就绪
lasttime readAtta is null
接下来 attach 的是:您的消息'他好吗'我已经收到了
after remove key
```
为什么经过 socketChannel.register(selector, SelectionKey.OP_READ);后(因为上一次执行了 WRITE 事件,然后在 WRITE 事件里,执行了 socketChannel.register(selector, SelectionKey.OP_READ);),下一次再执行 attachment,附件就丢了,变成 null 了呢
2020-03-21 22:10:10 +08:00
回复了 amiwrong123 创建的主题 Java NIO 中 检测到 channel 连接断开后的处理方法?
@aguesuka
非常感谢回复。

我用的服务端是这个代码 https://paste.ubuntu.com/p/hS9cQBdFyz/
发现每次都得手动停止掉服务端,来测试,还挺麻烦。。

第一种情况: 程序上呢,是每次 iterator 循环最后都 remove 掉 key 了。效果上呢,循环不断执行,每次都是 read 事件,每次 read 都抛异常。(抛异常说明对方已经断连接了,所以我也应该断连接,但我没有。所以,即使我每次 iterator 循环最后都 remove 掉 key,下一次 select 还是会选出 read 事件。 不知道我的理解对不)

第二种情况:程序上呢,是如果发现 read 抛出异常就 continue 循环,即不执行 remove key 了。效果上呢,第一次抛出异常,然后直接退出循环。(这个真没想通,为毛不 remove key,反而会导致下次 select 会直接返回 0 )

第三种情况:程序上呢,是如果发现 read 抛出异常就 continue 循环,并且 continue 之前,close channel,cancel key 。效果上呢,第一次抛出异常,然后阻塞在下一次 select 。(最后一种情况,看起来是最正常的情况,或者说,是想要的效果)

你说 SelectionKey#cancel 和 SocketChannel#close 这两个都会隐式调对方,这看源码能看出来吗。。SelectionKey#cancel 是懒汉模式的意思,只是说不会马上执行呗。

拷贝原来的 set,把原来的 set clear,然后循环被拷贝的 set 。之所以这么做,是因为 select 出来的集合 如果不显示 remove,集合永远不会删除掉元素呗。 所以不如先这样呗。
2020-03-19 10:40:08 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@cion
对,第二个客户端不出现确实是因为你说的。

我昨天回去又试了,发现第一个客户端出现沾包的情况也不是必现的。

然后觉得 tcp 只是实现了传输,在 tcp 之上还得实现对内容协议的规定,和发送回复的流程,比如 http
2020-03-18 13:15:39 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@jinhan13789991
@restlessdream
@cion

自己看了一遍,感觉像是,这里出错了。
client.write(charset.encode("您的昵称通过验证 "+user));
this.broadCast(welCome); //给所用用户推送上线信息,包括自己

这里的两句,好像是,时间间隔太短了。然后客户端在读取的时候,把两次的信息,都一次性读取出来了。所以客户端在收到验证后的名字时,先用空格分隔,然后第二个元素里不仅有名字,还有上线通知,所以客户端把名字和上线通知作为了自己的名字。

但是奇怪的是,为啥,第二个客户端不会发生这样的情况?
2020-03-18 11:34:57 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@restlessdream 好吧,你说的这个,我还没有考虑,主要刚开始熟悉 NIO,合计先用比较简单的方法来实现功能。
你说的原因,我想了下。那个上线通知是服务端通知给客户端的啊,为毛之后 客户端给服务端发消息,会带有这个上线通知呢,这不是两个方向吗?有点没想通
2020-03-18 11:19:51 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@cion 但为什么第二个运行的客户端,就肯定不会粘包啊,第三个,第四个也不会
2020-03-18 10:20:45 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
2020-03-18 09:36:19 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@jinhan13789991
可能因为是手机上吧,等会我再发个链接出来
2020-03-08 22:06:42 +08:00
回复了 amiwrong123 创建的主题 程序员 protobuf 的 repeated 字段在遇到 0 的时候,就很奇怪啊
@coer
你说的这个,我试了一下,在 java 的话,两个字节数组是一样的。

但是呢,好像是一旦传到了 C++层后,接受到字符串就不对。而我在 C++层解析后,会丢掉字节数组最后的 0,好像是因为 c++的字符串最后是以'\0'结尾的,所以会丢掉最后的 0。
2020-03-07 23:52:03 +08:00
回复了 amiwrong123 创建的主题 程序员 protobuf 的 repeated 字段在遇到 0 的时候,就很奇怪啊
@lixia625
@sikong31
@wanglufei
@Sasasu
@controller
@turi

真相大白了,是我不该用 string 作为载体的。
比如我在 java 层执行了 mess.toByteArray(proto),如果 IDs 字段为 [ 64,65,33,22,0 ] 转换成的字节数组为 [8 1 16 64 16 3 16 65 16 7 16 67 16 36 16 0 ] ,再执行 new String()就丢掉最后面那个 0.

然后我加接口了,让接口 直接传递那个字节数组就好了。

哎,怪自己考虑不周。
2020-03-02 16:53:54 +08:00
回复了 amiwrong123 创建的主题 C++ 为毛 stringstream 遇到 bitset 打印结果很奇怪?
@codehz
好吧,原来如此
@catror 也是哈,但正常运行代码都没问题,就单元测试时有问题,说明单元测试重复销毁了锁呗
2020-02-10 22:00:56 +08:00
回复了 crazylinus 创建的主题 电影 韩国电影《寄生虫》获得奥斯卡最佳影片
不行,不能我一个笑。。

<img src="https://s2.ax1x.com/2020/02/10/1IQBcj.png" alt="1581343199(1)" border="0">
@est
这个 surrogate pair 是 utf-16 里的东西,所以也有可能两个 char 代表一个字符的呗。

UseCompressedStrings 百度了下,它就是让 jvm 认为每个字符都是 ascii,也都是单字节的呗。
2020-02-10 15:01:55 +08:00
回复了 Sniper416 创建的主题 程序员 有类似波纹操作的 web 框架吗?
波纹是有极限的,还是替身使者的好
2020-02-05 19:08:50 +08:00
回复了 amiwrong123 创建的主题 问与答 如何让一个油猴脚本在页面完全加载后 再执行?
@keepeye
有点思路, 写了一句 js 代码可以改变颜色了。

但只有在页面完全加载后,在 F12 的 console 里运行这句话,才会成功。

如果把这句 js 代码写在油猴脚本里,就会报错,说这个元素是 undefine 的未定义的。
看来这个元素是动态加载出来的吧。之后按照网上说的 off on 解绑事件,绑定事件,但还是不好使。。
2020-02-05 16:13:38 +08:00
回复了 amiwrong123 创建的主题 问与答 如何让一个油猴脚本在页面完全加载后 再执行?
@lxk11153
这个我也试了,脚本自带这个设置,但我设置各个选项,都不能使得整个页面都改掉颜色。

<img src="https://s2.ax1x.com/2020/02/05/1s9mjg.png" alt="1580890382(1)" border="0">
2020-01-13 13:06:17 +08:00
回复了 idontgiveashit 创建的主题 问与答 被裁的第六天,开始投简历
灾难总是接踵而至,这正是世间的常理。你以为只要解释一下,就有谁会来救你吗?要是死了,就只能说明我不过是如此程度的男人。——索隆《海贼王》
1 ... 25  26  27  28  29  30  31  32  33  34 ... 39  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 22:58 · PVG 06:58 · LAX 14:58 · JFK 17:58
Developed with CodeLauncher
♥ Do have faith in what you're doing.