Java非阻塞NIO网络编程连接超时的处理

Java NIO 网络编程中的连接管理 本文旨在全面解析Java NIO在网络编程中的连接管理机制,帮助开发者理解NIO的核心原理并掌握高效管理网络连接的实践技巧。内容涵盖从基础概念到高级应用的全方位知识。文章首先介绍NIO的核心概念,然后深入分析连接管理的实现原理,接着通过实际代码示例展示具体实现,最后讨论应用场景和优化策略。: Java提供的非阻塞I/O APIChannel: 代表与实体的双向连接,如文件或套接字Selector: 多路复用器,用于监控多个Channel的状态Buffer: 数据容器,用于Channel读写操作。 阅读详情
AI摘要

本文介绍了一种在NIO网络编程中实现连接超时机制的方法,通过预先设置定时器,避免了传统open()方法的长时间阻塞问题。详细解释了如何在连接尝试失败时抛出SocketTimeoutException,以及如何通过Handler处理异常情况。

在NIO网络编程中,需要使用如下语句来完成客户端对服务器的连接:

			Selector selector = Selector.open();
			InetSocketAddress isa = new InetSocketAddress(host, port);
			// 调用open静态方法创建连接到指定主机的SocketChannel
			SocketChannel sc = SocketChannel.open(isa);

但却没有相关方法来设置超时参数,这就导致在调用open()方法时,如果连接不上服务器,那么此方法就会长时间阻塞(试了一下,大约阻塞了1-2分钟才抛出SocketTimeoutException),为了解决这个问题,我们可以在调用open()方法前,启动一个定时器,这个定时器会在指定的时间内检查是否已连接成功,这个指定的时间也就是我们希望设置的连接超时时间,当检查已连接上服务器时,提示用户已连接成功;若没有连接上,可在代码中抛出SocketTimeoutException,并提示用户连接超时。代码如下:

package com.test.thread;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Timer;
import java.util.TimerTask;

import android.os.Handler;
import android.os.Message;

public class NetworkNIOThread implements Runnable
{

	// 定义处理编码和解码的字符集
	public static final Charset CHAR_SET = Charset.forName("GBK");

	// 定义检测SocketChannel的Selector对象
	private Selector selector;

	// 客户端SocketChannel
	private SocketChannel sc;

	private Handler handler;
	private String host;
	private int port;

	public NetworkNIOThread(Handler handler, String host, int port)
			throws IOException
	{
		this.handler = handler;
		this.host = host;
		this.port = port;
	}

	@Override
	public void run()
	{
		connect();
	}

	public void connect()
	{
		try
		{
			selector = Selector.open();
			InetSocketAddress isa = new InetSocketAddress(host, port);
			//10秒连接超时
			new Timer().schedule(tt, 10000);
			// 调用open静态方法创建连接到指定主机的SocketChannel
			sc = SocketChannel.open(isa);
			// 设置该sc以非阻塞方式工作
			sc.configureBlocking(false);
			// 将Socketchannel对象注册到指定Selector
			sc.register(selector, SelectionKey.OP_READ);
			Message msg = new Message();
			msg.what = 0;
			msg.obj = sc;
			handler.sendMessage(msg); // 连接成功
			new Thread(new NIOReceiveThread(selector, handler)).start();

		}
		catch (IOException e)
		{
			e.printStackTrace();
			handler.sendEmptyMessage(-1); // IO异常
		}

	}
	
	TimerTask tt = new TimerTask()
	{

		@Override
		public void run()
		{
			if (sc == null || !sc.isConnected())
			{
				try
				{
					throw new SocketTimeoutException("连接超时");
				}
				catch (SocketTimeoutException e)
				{
					e.printStackTrace();
					handler.sendEmptyMessage(-6); // 连接超时
				}
			}
		}
		
	};
}


Java NIO 网络编程中的超时处理 本文旨在全面解析Java NIO网络编程中的超时处理机制,涵盖从基础概念到高级应用的全方位内容。NIO核心组件与超时处理的关联各种网络操作超时的检测与处理性能优化与最佳实践文章首先介绍NIO基础概念,然后深入分析超时处理机制,接着提供实际代码示例,最后讨论性能优化和未来发展趋势。: Java提供的非阻塞I/O APISelector: 多路复用器,用于监控多个通道的状态Channel: 代表与实体的开放连接Buffer: 数据容器,用于通道读写操作。 阅读详情

相关推荐

什么是plm系统?-数字化转型网

当今世界,产品研发能力是企业在激烈的市场竞争中保持战略优势的核心竞争力之一。如何有效地缩短产品研发周期、改善产品服务的设计迭代流程、有效降低产品的研发成本,也是企业面临的主要问题之一。PLM(Product Lifecycle Management,产品生命周期管理)在优化产品研发的全管理流程、增强企业产品的市场竞争力方面具有关键的作用。

cxo17757154043的博客 883

java nio 连接超时_如何设置Java NIO AsynchronousSocketChannel连接超...

答案是:你做不到.首先要了解的是TCP连接的工作原理.内核正在发送SYN数据包,在每次重试之间退出时间.这可以通过内核参数进行调整.可以在here找到一篇详细介绍(针对linux)的文章为了让您了解为套接字连接实现更短的超时所涉及的是将套接字置于非阻塞模式,将其置于带超时的select()中,然后使用getsockopt()查看发生的情况. This StackOverflow answer显示了...

weixin_35740875的博客 560

【Codesys】-扫描添加失败,手动添加第三方模块,真·DC模式的高速计数模块

欧姆龙耦合器(NX-ECC201)和高速计数模块(NX-EC0132)单独使用。扫描设备添加到Codesys中,会报错,无法自动添加。记录一下,以防忘记。高速的计数保证了位置的准确性,位置准确就能保证裁切的精度,一切的基础就在这儿了,奈何目前只有欧姆龙和倍福能做到这样的波形。

qq_35316470的博客 1389

java nio 连接超时_netty client 连接超时设置

public class Client4 {public static void main(String[] args) {//worker负责读写数据EventLoopGroup worker = new NioEventLoopGroup();long st = System.currentTimeMillis();try {//辅助启动类Bootstrap bootstrap = new B...

weixin_39743064的博客 764

Bellhop海底地形仿真入门:从MATLAB数据导入到3D可视化(附避坑指南)

本文详细介绍了Bellhop海底地形仿真的完整工作流程,从MATLAB数据导入、清洗与坐标转换,到构建.bty输入文件,再到生成高质量3D可视化结果。文章重点解析了数据格式、深度值正负、单位统一及坐标投影等关键环节的避坑指南,并提供了可复用的代码片段,帮助用户高效完成从原始数据到仿真成果的转换。

weixin_29275257的博客 194

【科研绘图】【数据拟合曲线】:附Origin详细画图流程

拟合曲线图

weixin_50236590的博客 4万+

java nio 连接超时_Java NIO(三)非阻塞socket的连接操作

异步连接需要做以下操作:设置socket为非阻塞模式注册OP_CONNECT事件OP_CONNECT事件发生时,调用SocketChannel的finishConnection代码如下:public class Client1 {Selector selector;int writeEventTrigerCount = 0;public void run() throws IOException ...

weixin_36433950的博客 789

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1919

java nio 连接超时_java - Apache HttpAsyncClient-所有连接突然超时,以后所有请求均失败 - 堆栈内存溢出...

我正在使用RestHighLevelClient实例与远程Elasticsearch群集进行通信,该群集内部使用Apache HttpAsyncClient (org.apache.httpcomponents:httpasyncclient:4.1.4)管理静态HTTP请求和响应。请求的速率约为每秒100个,每个请求耗时30ms。 应用程序启动后, HttpAsyncClient将在大约随机的...

weixin_34652835的博客 1440

LVGL v8学习笔记 | 09 - 进度条控件的使用方法(bar)

lv_bar_set_range必须放在lv_bar_set_mode前面,否则不生效。bar对象的API在lv_bar.h中声明,以lv_bar_xxx命名。此事件可以用来在进度条更新值之后更新别的控件(比如进度条旁边的文字)。可以看到,默认创建的进度条值是0到100。(3)设置进度条的范围值(最大值和最小值)(2)获取进度条的起始值。(3)获取进度条的最小值。(4)获取进度条的最大值。(1)设置进度条的当前值。(2)设置进度条的起始值。(1)获取进度条当前值。(5)获取进度条的模式。

Mculover666的博客(嵌入式) 1730

Android Framework SurfaceFlinger面试题及参考答案

请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是 Android 系统中一个非常关键的服务。它主要负责将多个应用程序的 Surface 合成到一个屏幕显示内容中。 从应用程序的角度来看,每个应用都有自己的 UI 界面,这些 UI 界面实际上是由一系列的图层(Surface)构成。例如,一个应用可能有背景图层、按钮图层、文本图层等。应用通过向 SurfaceFlinger 提供这些 Surface 来请求显示。 SurfaceFl

大模型大数据攻城狮的专栏 1185

java nio 连接超时,“ java.io.IOException:连接超时”与“和“ SocketTimeoutException:读取超时”;...

If I set a socket SoTimeout, and read from it. when read time exceed the timeout limit, I'll get an "SocketTimeoutException: Read timed out".and here is the stack in my case:java.net.SocketTimeoutExce...

weixin_30789921的博客 2687

Uncaught ReferenceError: process is not defined

这个错误 Uncaught ReferenceError: process is not defined 通常出现在浏览器环境中,因为 process 是 Node.js 环境的内置对象,并不是浏览器原生支持的。因此,浏览器无法识别 process,导致该错误。在App.vue中加上以下代码就能够有效解决。

猿小白的博客 1740

Java非阻塞NIO

NIO 回顾: 1 计算机网络:目的:信息传递,资源共享 2 osi参考模型 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 3 Tcp Ip参考模型 网络层 互联网层 输出层 应用层 4 协议 TCP 传输控制协议 UDP 用户数据包协议 IP 网际协议 5 Ip地址 ipv4 ...

♾️ 2351

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java nio 原理 非阻塞IO Netty

一、为什么必须去了解NIO首先你需要之后Netty的主要实现手段就是Nio,很多人一直学不明白Netty,根本原因是 除了日常开发中很难能够实践,很大一部分原因是不熟悉NIO,事实上真正熟悉了NIO和它背后的原理之后,去查看Netty的源码就有如神助!我们今天就从最基本的IO、以及NIO学起!二、操作系统是如何定义I/O...

cnzzs的博客 1204

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 输入与输出之 NIO【非阻塞式IO】【NIO网络编程】探索之【二】

Java 标准的输入/输出流(Input/Output,简称I/O)是Java语言用于读写数据的API,它提供了一系列类和接口,用于读取和写入各种类型的数据信息。 BIO全称是Blocking IO,同步阻塞式IO,是JDK1.4之前的标准IO模型。 Java NIO(New I/O)是Java 1.4版本中引入的一套全新的IO处理机制,与之前的标准IO(BIO)相比,NIO具有更高的可扩展性和灵活性,特别是在网络编程和高并发场景下,表现得更为出色。本文探讨了NIO的网络通讯应用。

weixin_42369079的博客 1345

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【网络编程】Netty采用的NIO为什么是同步非阻塞的?

参考链接:https://www.leahy.club/archives/netty-nio-sync-nonblocking 这个问题可以分为两部分:NIO为什么是同步非阻塞的?Netty是如何实现NIO的? 那么首先需要回答是什么是同步/异步,什么是阻塞/非阻塞? 同步/异步和阻塞/非阻塞描述的都是IO操作。 同步和异步: 从操作系统角度来说,网络IO的数据拷贝主要分为两个阶段,一是数据准备阶段,二是数据从内核拷贝到用户中。 同步IO指的是数据从内核拷贝到用户时。发起该请求的线程会自己来拷贝数据(表现为

weixin_41954254的博客 5101

在Java中使用NIO进行网络编程

在JDK中,有一个非常有意思的库:NIO(New I/O)。这个库中有3个重要的类,分别是java.nio.channels中Selector和Channel,以及java.nio中的Buffer。本篇文章我们首先了解一下为什么需要NIO来进行网络编程,然后看看一步一步来讲解如何在网络编程中使用NIO。为什么需要NIO使用Java编写过Socket程序的同学一定都知道Socket和

4439

Java网络编程NIO

缓冲区,包括直接内存缓冲和JVM内存缓冲。NIO是基于channel通信,一个线程管理一个selector,一个selector管理多个channel,这样一个线程就能管理多个客户端连接。一般是通过服务通道监听端口,等待客户端的连接通道,然后将连接通道注册到Selector,等待事件触发通道行为。由于IO无法直接操作应用内存,因此需要将应用内存数据拷贝到直接内存,如果使用直接内存,就可以少一次拷贝操作。:选择器,负责管理多个通道channel,通过监听通道绑定的事件,及时处理通道数据。

weixin_74261199的博客 1324

Java网络编程——非阻塞IO(NIO)

非阻塞IO(NIO) 阻塞型IO的局限        阻塞型IO会阻塞当前线程,所以就需要创建单独的线程专门来处理这个阻塞的任务,然而Java虚拟机会为每个线程分配独立的堆栈空间以及程序计数器等资源。工作线程开得越多,系统的开销就越大,并且相应的线程之间的同步就越复杂。就算为每个阻塞的IO分配了线程,但是这些线程大部分时间都是阻塞在IO上的,Java虚拟机会频繁地进行CPU调度

Benson的博客 977

Java网络编程——使用NIO实现非阻塞Socket通信

除了普通的Socket与ServerSocket实现的阻塞式通信外,java提供了非阻塞式通信的NIO API。先看一下NIO的实现原理。          从图中可以看出,服务器上所有Channel(包括ServerSocketChannel和SocketChannel)都需要向Selector注册,而该Selector则负责监视这些Socket的IO状态,当其中任意一个或者多个Chan

姚艳梅 廊坊师范学院七期信息技术提高班 1万+

Java NIO详解:深入理解非阻塞式网络编程

Java NIO(New I/O)是一种高性能的I/O处理机制,它提供了对标准Java I/O API的替代方案,以支持更高效的文件和网络数据传输。本文将从NIO的基本概念、核心组件、关键特性以及实际应用等方面进行全面深入的解析,帮助读者理解并掌握这一强大工具。

suqieer的博客 2049

NIO网络编程

关于NIO的基本用法和五种IO模型简介,学习参考使用

What大潘的博客 3841
上一篇: TCP/IP,http,socket,长连接,短连接
下一篇: Java 异常处理及其应用
IDTC
博客等级 码龄15年 22粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值