我们都有声音的,你检查一下你的扬声器是否可以用?或者是不是电脑上面插着耳机呢,你忘记了?
同学、请认真提问,
我觉得写在外面更好,
123456
non-blocking io和new io不是一回事,从字面理解,一个是非阻塞io,一个是新io。他们是包含关系,新io是包阻塞io和非阻塞io的,就是一个configureBlocking参数来决定的. 如果说非阻塞io bio也可以是非阻塞io。方法就是多线程模式。
解决了 方法里面用错channel了 自己失误
xmind 思维导图 ,类似的软件有诸如百度脑图
这个看不懂也没事,理清思路,看懂步骤操作。能看懂api就行,知道如何使用就行,代码不用记住。若是真想看懂,可以先理解一下中文意思,再看老师的代码。
服务器接收客户端请求时,需要读取客户端发送的请求数据,这时候要注册可读事件;
服务器接收完客户端的请求后,需要向客户端发送一个响应,也就是需要向客户端写数据,这时候要注册可写事件;
服务器将响应写给客户端后,又需要等待客户端的下一次请求,所以又需要注册可读事件;
333333
如果接收数据也放在main线程中,while(scanner.hasNextLine) 一直在循环,你的数据怎么能接收到呢,或者你先把接收数据代码是一个while(true)代码是死循环,线程一直在执行一个循环体中的代码
你可以这样理解,服务度设置非阻塞模式是规则;客户端连接的时候也要按照这个规则连接;然后剩下的可读,可写都是在这个规则下进行的,所以就不要再设置了
距离提问已经三年了,你应该已经有了答案,但还是简单回答一下吧!
如果是普通的网络请求,一般走http请求的模式就够了,一问一答,简单方便
如果是对实时性和持续连接要求比较高的,可以采用websocket方案
还有一种就是通知的推送,这种一般走的差不多就是课程里的方案,tcp长连接,但是还会加上一些心跳检测之类的机制等等,推送是个很大的学问,市面上专门做推送的厂商也有很多,可以去了解一下
我是把下载的代码直接放到Eclipseli运行的,先启动服务端没问题,再启动AClient或者BClient 报错信息:
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at sun.nio.ch.Net.connect0(Native Method)
at sun.nio.ch.Net.connect(Net.java:454)
at sun.nio.ch.Net.connect(Net.java:446)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:648)
at java.nio.channels.SocketChannel.open(SocketChannel.java:189)
at NioClient.start(NioClient.java:23)
at AClient.main(AClient.java:7)
public static void main(String[] args)
throws IOException {
new NioClient().start("AClient"); //这行报错 第7行
}
你看socketChannel.write(这里接收一个ByteBuffer对象)。encode(nickName...)这里也返回的是一个ByteBuffer对象。所以还是在借助byteBuffer来操作socketChannel的。
Netty是一个NIO客户端服务器框架,是一个提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。可以快速轻松地开发协议服务器和客户端等网络应用程序。
Github地址:https://github.com/netty/netty
官网:https://netty.io/
开发文档:https://netty.io/wiki/user-guide-for-4.x.html
API文档:https://netty.io/4.1/api/index.html
???不错哦
xmind
这个暂时好像没有这个功能,只能手动下一节
你的意思是:为什么服务器只监听、处理接入事件和可读事件,而没有监听、处理可写事件是吧。是因为一般的服务器都是一问一答式的,就是说由客户端问,服务器端答。所以服务器只需要监听可读就好,并不需要再监听可写了,也没有这种必要。
000000000000000000
最开始没有任何客户端接入时,serverSocketChannel注册的是ACCEPT事件,等待客户端接入;等到有客户端接入后,服务器与客户端建立的socketChannel就要注册READ事件了。而serverSocketChannel还是注册ACCEPT事件,继续等待其他客户端的接入。
首先,一个Channel只能被注册到Selector上一次,如果将Channel注册多次到Selector上,其实相当于是在更新。所以,如果对Channel感兴趣的事件没有变化,是不需要重新注册的。故,源码中把再次注册的代码去掉也是不影响运行的,此处又注册了一遍只是想让大家加深印象。没想到给你带来了困惑,不好意思啊。
是要问什么问题
NIO只是作为网络通信层,算是聊天室的组成部分。现在主流的网络通信就是netty框架了。