我们建立普通的Socket时,我们必须等待连接建立成功,才能继续下一步工作,比如常见的代码如下
System.out.println("普通建立连接....");
Socket socket = new Socket("www.java2000.net", 80);
System.out.println(socket.isConnected());
我们的代码,必须等待第二行完成后,才能继续运行。考试大提示如果对方服务器比较慢,则会有比较长的时间处于阻塞状态。
下面的代码使用SocketChannel实现了非阻塞的链接。
package net.java2000.nio;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SocketChannel;
/**
* 非阻塞的Socket链接。
* 可以在链接建立期间做一些别的操作。
*/
public class SocketNonBlock {
/**
* 创建一个非阻塞的Socket通道。
*
* @param hostName
* 主机
* @param port
* 端口
* @return Socket端口
* @throws IOException
*/
public static SocketChannel createSocketChannel(String hostName, int port)
throws IOException {
SocketChannel sChannel = SocketChannel.open();
sChannel.configureBlocking(false);
sChannel.connect(new InetSocketAddress(hostName, port));
return sChannel;
}
public static void main(String[] args) {
try {
System.out.println("普通建立连接....");
Socket socket = new Socket("www.java2000.net", 80);
System.out.println(socket.isConnected());
// 创建链接
SocketChannel sChannel = createSocketChannel("www.java2000.net", 80);
// 可以通过判断是否连接,在链接成功建立前做一些其它的事情
while (!sChannel.finishConnect()) {
System.out.println("等待非阻塞连接建立....");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(sChannel.isConnected());
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果
普通建立连接....
true
等待非阻塞连接建立....
等待非阻塞连接建立....
true
总结:
非阻塞链接,可以让我们在等待链接建立期间做一些其它的工作。
分享到:
相关推荐
通过java网络编程深入理解socket阻塞通信和非阻塞通信的在网络中的应用 源码包每一行都有注释,在代码里面每一个类都有详细的注释来解释这个类的功能这个方法的功能,调用哪一个类的哪一个功能等等。 压缩包包含实验...
在实际应用中,非阻塞Socket通信常用于多用户在线游戏、实时聊天软件、文件传输服务等场景,能够有效地处理并发连接,提高系统资源利用率。结合protobuf,可以实现跨平台、高效的网络数据交换,简化通信协议的设计和...
总结,C++ Socket编程中的阻塞与非阻塞模式选择取决于具体需求,如对实时性、响应速度或资源利用率的要求。多线程技术可以帮助提高服务器处理并发请求的能力,而定时清除连接资源则是保持服务器高效运行的重要策略。...
Linux下的Socket编程实例(阻塞和非阻塞) 通过分析给定的文件信息,我们可以生成以下知识点: Socket编程概述 Socket 编程是指使用操作系统提供的 socket 编程接口来实现网络通信的编程方式。Socket 编程可以实现...
用Java实现非阻塞通信 java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。 ● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信...
本篇主要关注的是Socket编程中的阻塞和非阻塞模式,这两种模式在处理I/O操作时有着显著的区别。 阻塞Socket(Blocking Socket)是最基础的Socket编程模型。当一个Socket被设置为阻塞模式时,调用recv()或send()等...
该项目是一款基于Java语言的异步非阻塞socket通讯内核设计源码,总文件量为432个,其中Java源文件占主导地位,共计381个。此外,还包括25个XML配置文件、13个Markdown文档、3个Shell脚本、3个属性文件、1个YAML配置...
服务端通过多线程接收连接请求,利用非阻塞Socket避免等待数据的阻塞,同时子进程处理接收到的数据。客户端则可以并行地向多个服务端发送数据,进行测试或通信。通过这种方式,我们可以构建出高效、可扩展的网络应用...
- **优点**:非阻塞,提高了系统资源利用率;多路复用,可以处理大量并发连接。 - **缺点**:API复杂,学习曲线较陡峭;处理高并发时,性能可能不如传统的多线程模型。 5. **代码实现** - **Server端**:创建...
在这个"socket多线程例程非阻塞模式"的示例中,我们将深入探讨如何在Windows平台上实现多线程的socket通信,并了解非阻塞模式的工作原理。 首先,让我们来理解Socket的基本概念。Socket是进程间通信(IPC)的一种...
用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制
非阻塞Socket是一种在计算机网络编程中常用的通信机制,它允许程序在等待数据或完成I/O操作时,不被阻塞而能继续执行其他任务。这种模式与传统的阻塞Socket相反,阻塞Socket会在发送、接收数据或者连接、断开连接时...
### Linux UDP Socket 非阻塞模式与阻塞模式的区别详解 #### 一、引言 在进行网络编程时,我们经常会遇到阻塞模式与非阻塞模式的选择问题。这两种模式直接影响程序的运行效率和资源利用率。本文将详细介绍在Linux...
### Socket C++ TCP阻塞与非阻塞服务器客户端开发 #### 概述 本文档将详细介绍如何使用C++ Winsock库来开发TCP非阻塞服务器。通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解...
"Java Socket学习---单线程阻塞"这个主题主要探讨了如何使用Java的Socket类进行单线程的阻塞式通信,这种模式通常用于简单的客户端-服务器应用。在这个场景中,服务器端通过一个线程处理一个客户端的请求,当请求被...
4. 设置非阻塞模式:在Windows下,可以通过`ioctlsocket()`函数配合`FIONBIO`标志来设置`socket`为非阻塞模式。 5. 异步事件处理:`WSAAsyncSelect()`或`WSAEventSelect()`函数的使用,以及如何根据接收到的事件进行...
非阻塞模式的Socket编程是网络编程中的一个重要概念,它与传统的阻塞模式Socket形成了鲜明对比。在阻塞模式下,Socket操作会一直等待直到有数据可读或可写,这可能导致程序在等待期间无法执行其他任务。而非阻塞模式...
总之,通过这个使用AIO实现的非阻塞socket通信项目,我们可以学习到如何利用Java AIO进行高效的网络编程,理解和实践异步I/O模型,这对于构建高性能、高并发的网络应用至关重要。通过实际操作,你可以更好地理解非...
在通过一天学习,慢慢摸索中,研究出来了自己成果!