`
sw1982
  • 浏览: 511238 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

谨慎使用SocketChannel的read方法

阅读更多

下面的代码是一个实例化SocketChannel的过程:

		SocketChannel channel = SocketChannel.open();
		//要设置连接超时
		channel.socket().connect(addr,connectionTimeOut_ms);
		//设置读超时
		channel.socket().setSoTimeout(timeout_ms);
 

然后基于NIO的一贯性崇拜,会出现channel.read()读取数据

int java.nio.channels.ReadableByteChannel.read(ByteBuffer dst) throws IOException

Reads a sequence of bytes from this channel into the given buffer. 

 

唯一不幸的是,这个SocketChannel的read()方法与Socket不同,是没有超时设置的!

 

所以上面做了一堆socket的超时设置,在Channel read毫无作用。具体可以查看http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4614802

 

 

 

就解决这个问题上来说,还是建议用回传统的Socket阻塞试读取整个流。或者使用ReadableByteChannel这个类(不能解决读写双向的Channel阻塞问题),封装Socket流,多绕了一圈而已。

 

//i.读取buffer的chanel
InputStream is = sock.socket().getInputStream();
ReadableByteChannel readCh = Channels.newChannel(is);
 
分享到:
评论

相关推荐

    java的ServerSocketChannel与SocketChannel的使用

    4. 读写数据:使用`read(ByteBuffer buffer)`和`write(ByteBuffer buffer)`方法进行数据传输。注意,非阻塞模式下,如果通道没有准备好读写,这些方法会立即返回。 在实际应用中,通常结合`Selector`使用`...

    tcp.rar_SocketChannel_SocketChannel HTTPS_java socketchannel_非阻

    6. 在会话建立后,就可以使用非阻塞的`read()`和`write()`方法进行数据的传输了。 在实际应用中,我们还需要处理各种异常情况,例如证书验证失败、网络中断等。同时,为了优化性能,我们可能需要使用Selector来监控...

    java SocketChannel通信实例

    3. 注册Selector:使用SocketChannel的register()方法,将通道注册到Selector上,同时指定感兴趣的事件,如OP_ACCEPT(连接请求)、OP_READ(数据可读)或OP_WRITE(数据可写)。 4. 循环调用Selector的select()方法...

    使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket

    本篇文章将详细解析如何使用非阻塞ServerSocketChannel和SocketChannel来替代传统的ServerSocket和Socket。 **1. 阻塞与非阻塞I/O** 在阻塞I/O模型中,当一个线程调用read或write方法时,如果数据没有准备好或者...

    SocketChannel、ServerSocketChannel与Selector的实际案例

    与传统的Socket相比,SocketChannel允许我们在读写操作上使用非阻塞模式,从而提高程序的并发性能。 2. **ServerSocketChannel**:这个类代表了一个服务器端的套接字,用于监听客户端的连接请求。创建...

    niossl:SSLSocketChannel和SSLServerSocketChannel实现

    NIO SSL 与阻塞IO不同,JVM不提供扩展基本套接字通道类的标准SSLSocketChannel和SSLServerSocketChannel类。 相反,必须使用手动编排SSL交换。...使用SSLSocketChannel 由普通的SocketChannel和必要的SSL相关信息

    ProxiedSocketChannel:一个 Java SocketChannel 实现,它使用提供的 Proxy 实例通过提供的代理建立网络连接

    一个 Java SocketChannel 实现,它使用提供的 Proxy 实例通过提供的代理建立网络连接。 SocketChannel 是通过表面下的 Socket 实例实现的。 限制 此实现目前仅支持阻塞模式。 请注意,这是 SocketChannel 实例的默认...

    【IT十八掌徐培成】Java基础第27天-02.NIO-ServerSocketChannel-SocketChannel.zip

    SocketChannel支持读写操作,可以通过`read(ByteBuffer)`和`write(ByteBuffer)`方法进行数据传输。与传统IO不同的是,NIO的读写操作是非阻塞的,这意味着如果无数据可读或无法写入时,线程不会被挂起,而是立即返回...

    高级 socket 通信

    2. **非阻塞读写**:与传统的阻塞I/O不同,SocketChannel的read()和write()方法是非阻塞的。如果缓冲区没有数据可读或已满,这些方法将立即返回,而不是等待,从而避免了线程的无效等待。 3. **零拷贝**:NIO支持...

    java多路复用socket客户端.

    使用socket channel 连接服务器,断线重连,发送保活等的封装类。 Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的...

    基于SocketChannel的即时聊天程序

    没有使用其他jar包 主要功能: 1、广场群聊,即发送的消息所有在线的人都能看到 2、聊天室群聊,可以创建聊天室,进入聊天室的人可以在里面聊天,创建的人或者是第一个人为管理员,拥有踢人的权限;广场上有一个...

    JAVA nio的一个简单的例子

    5. **读取和写入数据**:对于每个连接的SocketChannel,可以使用`read()`或`write()`方法读写数据。在这个例子中,服务器会读取客户端发送的字符串,计算哈希值,然后将结果写回给客户端。 客户端通常使用...

    java nio Selector的使用-客户端

    我们可以使用`channel.configureBlocking(false)`将通道设置为非阻塞模式,然后调用`channel.register(selector, interestOps)`方法将通道注册到Selector上,其中`interestOps`是想要监听的事件类型,如OP_READ、OP_...

    实现java网络与nio例子

    使用`SocketChannel.read(ByteBuffer)`读取数据,`SocketChannel.write(ByteBuffer)`写入数据。 - 缓冲区(ByteBuffer)用于存储数据,可以使用`ByteBuffer.allocate()`分配内存,`put()`写入数据,`flip()`切换到...

    java-nio.rar_NIO_java nio

    同样,当读取数据时,客户端也会创建一个`ByteBuffer`,并使用`read()`方法尝试从通道读取数据。如果数据尚未到达,`read()`方法将返回-1,表明没有可用数据,客户端可以选择等待或者执行其他任务。 `...

    Android开发进阶之NIO非阻塞包

    - **读取数据**:使用`socketChannel.read(ByteBuffer buffer)`从SocketChannel中读取数据。 - **发送数据**:使用`socketChannel.write(ByteBuffer buffer)`向SocketChannel中写入数据。 2. **ByteBuffer**:它...

    使用多线程的NIO构建简易的多线程java服务器

    当`SocketChannel`准备好读取数据时,调用`read()`方法;准备好写入数据时,调用`write()`方法。注意,NIO的`read()`和`write()`操作是非阻塞的,如果缓冲区无数据可读或无空间可写,它们会立即返回。 7. **多线程...

    nio异步长连接服务端与客户端

    - **SocketChannel的连接**:客户端使用SocketChannel的connect()方法发起连接请求。 - **数据传输**:连接建立后,客户端和服务器可以通过read()和write()方法进行数据交换。 5. **数据处理**: - **缓冲区读写...

    libgdx net的使用

    - 使用`read()`和`write()`方法发送和接收数据。 ```java NioClientSocketChannel client = NioClientSocketChannel.open(); client.connect(new InetSocketAddress("localhost", 4444)); // 发送数据 ByteBuffer...

Global site tag (gtag.js) - Google Analytics