nio 客户端与服务端通信Demo

Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码 服务器在JAVA上,客户端为C++,实现多人聊天消息转发,服务器也可以给客户端发送消息。附上项目完整源代码,client包负责消息发送,sensor包负责消息接收 立即下载

本篇博文主要是从网上收集和整理众多网友关于NIO的理解所写的博文,非作者原创(除最后的服务端与客户端通信的Demo),在此声明。

1. NIO入门概念:

主要参考文献:Java nio 使用及原理分析

Java NIO 使用及原理分析(一):

      主要对缓冲区Buffer的概念和通道Channel的概念进行了简单的介绍;

    缓冲区 实际上是一个数组,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到缓冲区中。而在面向流I/O系统中,所有数据都是直接写入或者直接将数据读取到Stream对象中。

    通道是一个对象,通过它可以读取和写入数据,当然了所有数据都通过Buffer对象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

使用NIO读取数据 (将chanel对应的终端数据读入到buffer中, 核心方法inChannel.read(buffer))

1. 从FileInputStream获取Channel
2. 创建Buffer
3. 将数据从Channel读取(read)到Buffer中

使用NIO写入数据 (将buffer中的数据写入到channel对应的终端,核心方法,channel.write(buffer))

1. 从FileInputStream获取Channel

2. 创建Buffer

3. 将数据从Channel写入(write)到Buffer中

import java.io.*;  
import java.nio.*;  
import java.nio.channels.*;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;  
  
public class ChannelReadToBuffer {  
    static public void main( String args[] ) throws Exception { 
    	Charset charset = Charset.forName("GBK");
    	CharsetDecoder decoder = charset.newDecoder();
        FileInputStream fin = new FileInputStream("e:\\nioTest\\src.txt");  
        // 获取通道  
        FileChannel fc = fin.getChannel();  
        // 创建缓冲区  
        ByteBuffer byteBuffer = ByteBuffer.allocate(512);  
        CharBuffer charBuffer = CharBuffer.allocate(512);
        // 读取数据到缓冲区  
        fc.read(byteBuffer);  
        byteBuffer.flip();
        
        decoder.decode(byteBuffer, charBuffer, false);  
        charBuffer.flip();
        
        System.out.println(charBuffer);            
        fc.close();  
        fin.close();
    }  
}  

    import java.io.*;  
    import java.nio.*;  
    import java.nio.channels.*;  
      
    public class Program {  
        static private final byte message[] = { 83, 111, 109, 101, 32,  
            98, 121, 116, 101, 115, 46 };  
      
        static public void main( String args[] ) throws Exception {  
            FileOutputStream fout = new FileOutputStream( "c:\\test.txt" );  
              
            FileChannel fc = fout.getChannel();  
              
            ByteBuffer buffer = ByteBuffer.allocate( 1024 );  
              
            for (int i=0; i<message.length; ++i) {  
                buffer.put( message[i] );  
            }  
              
            buffer.flip();  
              
            fc.write( buffer );  
              
            fout.close();  
        }  
    }  

Java NIO 使用及原理分析(二)和 Java NIO 使用及原理分析(三):

主要介绍了buffer的 position limit capacity flip slice等概念;

缓冲区的分配:allocate()

缓冲区分片:slice()

只读缓冲区:asReadOnlyBuffer()

内存映射文件I/O:MappedByteBuffer

Java NIO 使用及原理分析(四):

NIO中非阻塞I/O采用了基于Reactor模式的工作方式,I/O调用不会被阻塞,相反是注册感兴趣的特定I/O事件,如可读数据到达,新的套接字连接等等,在发生特定事件时,系统再通知我们。NIO中实现非阻塞I/O的核心对象就是Selector,Selector就是注册各种I/O事件地 方,而且当那些事件发生时,就是这个对象告诉我们所发生的事件,如下图所示:


当有读或写等任何注册的事件发生时,可以从Selector中获得相应的SelectionKey,同时从 SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据

使用NIO中非阻塞I/O编写服务器处理程序,大体上可以分为下面三个步骤:

1. 向Selector对象注册感兴趣的事件
2. 从Selector中获取感兴趣的事件
3. 根据不同的事件进行相应的处理

具体博主缩写的示例也很清楚,只是写的有点简单,并且没有说清客服端如何处理详细的请求;后面我们给出一个详细的示例进行展示;

2. 使用selector进行客户端与服务端的通信

参考文献:

(1) 白话NIO之Selector

(2) Java NIO学习笔记(三) 使用Selector客户端与服务器的通信

3. 客户端与服务端selector通信demo

3.1 服务端代码:

package com.qian.nio.scoket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class ServerSocketDemo {
	
	private static final String IP = "10.86.38.57";
	private static final int PORT = 8001;
	private static final int BUFFER_SIZE = 128;
	//统计客户端的个数
	private static int clientCount = 0;
	
	private static ServerSocketChannel serverChannel = null;
	
	public static void server() throws IOException{
		//1. 获取服务端通道并绑定IP和端口号
		serverChannel = ServerSocketChannel.open();
		serverChannel.socket().bind(new InetSocketAddress(IP, PORT));
		//2. 将服务端通道设置成非阻塞模式
		serverChannel.configureBlocking(false);
		//3. 开启一个选择器
		Selector selector = Selector.open();
		//4. 向选择器上注册监听事件(接收事件)// 注册该事件后,当事件到达的时候,selector.select()会返回, 否则会一直阻塞  
		serverChannel.register(selector, SelectionKey.OP_ACCEPT);
		// 采用轮训的方式监听selector上是否有需要处理的事件,如果有,进行处理  
		while(true){
			// 轮训selector
			selector.select();
			//5. 获取选择器上所有监听事件值
			Set<SelectionKey> selectionKeySet = selector.selectedKeys();
			Iterator<SelectionKey> it = selectionKeySet.iterator();
			while(it.hasNext()){
				//6. 获取selectionKey值
				SelectionKey selectionKey = it.next();
				try{//解决客户端关闭或 服务端读取不到获取无法写入客户端报IO异常;
					//7. 根据key值判断事件
					if(selectionKey.isValid() && selectionKey.isAcceptable()){//测试此键的通道是否已准备好接受新的套接字连接。
						//8. 接入事件处理
						SocketChannel socketChannel = serverChannel.accept();
						socketChannel.configureBlocking(false);
						socketChannel.register(selector, SelectionKey.OP_READ);
						//响应客户端;(没有必要的)导致客户端
						clientCount++;
						replyClientForAcceptable(socketChannel);
					} else if(selectionKey.isValid() && selectionKey.isReadable()){
						// 处理客户端发送来的消息
						dealClientMsg(selectionKey);						
						// 响应客户端
						replyClientMsg(selectionKey);
					} else if(selectionKey.isValid() && selectionKey.isWritable()){
						
					}
					//10. 手动删除selectionKey 
					it.remove();
				}catch(IOException e){
					if(selectionKey!=null){
						selectionKey.cancel();						
					}
					SocketChannel sc = (SocketChannel) selectionKey.channel();
					if(sc!=null){
						sc.socket().close();
						sc.close();
					}
					continue;//继续监听其他客户端发来的消息;
				}
			}
		}
		
	}
	
	/**
	 * @Description 响应客户端的接入事件;
	 * @param socketChannel
	 * @throws IOException
	 */
	private static void replyClientForAcceptable(SocketChannel socketChannel) throws IOException {
		ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
		buffer.put(("hello client "+clientCount+"!\r\n").getBytes());
		buffer.flip();
		socketChannel.write(buffer);
		buffer.clear();
	}
	
	/**
	 * @Description 处理客户端消息;
	 * @param selectionKey
	 * @throws IOException
	 */
	private static void dealClientMsg(SelectionKey selectionKey) throws IOException {
		SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
		ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
		int len = 0;
		//将客户端socket发送来的数据读入到buffer中;
		while ((len = socketChannel.read(buffer)) > 0) {
			buffer.flip();
			byte[] bytes = new byte[BUFFER_SIZE];
			buffer.get(bytes, 0, len);
			String msg = new String(bytes,0,len);
			//将客户端发来的消息打印到控制台
			System.out.println(msg);
		}
	}
	
	/**
	 * @Description 回复客户端消息;
	 * @param selectionKey
	 * @throws IOException
	 */
	private static void replyClientMsg(SelectionKey selectionKey) throws IOException {
		SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
		ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
		buffer.put(("get your message of client !\r\n").getBytes());
		buffer.flip();
		socketChannel.write(buffer);
		buffer.clear();
	}


	public static void main(String[] args) {
		try {
			server();
		} catch (IOException e) {
			if(serverChannel != null){
				try {
					serverChannel.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

}

客户端:

package com.qian.nio.scoket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Scanner;

public class ClientSocketDemo {
	
	private static final String IP = "10.86.38.57";
	private static final int PORT = 8001;
	private static final int BUFFER_SIZE = 128;
		
	public static void send() throws InterruptedException  {
		SocketChannel socketChannel = null;
		try{
			//1. 获取socketChannel
			socketChannel = SocketChannel.open();
			//2. 创建连接
			socketChannel.connect(new InetSocketAddress(IP, PORT));
			//3. 设置通道为非阻塞
			socketChannel.configureBlocking(false);    
			// 发送握手消息
			sendHandMsg(socketChannel);
			// 接收握手消息,实际上是接收的服务端Acceptable中的响应
			Thread.sleep(10);
			reciveServerMsg(socketChannel);
			ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
			@SuppressWarnings("resource")
			Scanner scanner = new Scanner(System.in);//键盘输入
			String msg;
			System.out.println("Please input your message to server : ");
			while (scanner.hasNext()) {
				msg = scanner.nextLine();
				buffer.put((new Date() + ": " + msg).getBytes());
				buffer.flip();
				//4. 向通道写数据(向服务端发送数据)
				socketChannel.write(buffer);   
				buffer.clear();
				// 接收服务端发来的数据
				Thread.sleep(10);
				reciveServerMsg(socketChannel);
			}
		}catch(IOException e){			
			System.out.println("=======服务端已关闭连接 消息发送失败=====");
		}finally{
			if(socketChannel != null){
				try {
					socketChannel.close();
				} catch (IOException e) {
					e.printStackTrace();
				}				
			}
		}
	}

	
	private static void sendHandMsg(SocketChannel socketChannel) throws IOException {
		//响应服务端的握手在channel.write(buffer)以后服务端才会调用Acceptable中响应消息函数
		ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
        buffer.put((new Date() + ": hello server!\r\n").getBytes());
        buffer.flip();
        //4. 向通道写数据
        socketChannel.write(buffer);
        buffer.clear();
	}
	
	/**
	 * @ Description接收服务端发送回来的消息;
	 * @param socketChannel
	 * @throws IOException
	 */
	private static void reciveServerMsg(SocketChannel socketChannel) throws IOException {
		ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
		while ((socketChannel.read(buffer)) > 0) {
            buffer.flip();
            while (buffer.hasRemaining()) {
                System.out.print((char) buffer.get());
            }
            buffer.clear();
        }
	}
	
	public static void main(String[] args) throws IOException, InterruptedException {
		send();
	}

}

演示结果:

客户端1:

hello client 1!
get your message of client !
Please input your message to server : 
client1 a
get your message of client !
clent1 b
get your message of client !
client1 stop
get your message of client !
client1 end
get your message of client !

客户端2:


服务端:



几点说明和注解:

第一:

一个Channel仅仅可以注册到一个Selector一次,如果将Channel注册到Selector多次,那么其实相当于在更新SelectionKey 的 insterest set。

channel.register(selector, SelectionKey.OP_READ);
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

上面的 channel 注册到同一个 Selector 两次了, 那么第二次的注册其实就是相当于更新这个 Channel 的 interest set 为 SelectionKey.OP_READ | SelectionKey.OP_WRITE.

第二:

Set<SelectionKey> selectedKeys = selector.selectedKeys();

Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

while(keyIterator.hasNext()) {
    
    SelectionKey key = keyIterator.next();

    if(key.isAcceptable()) {
        // a connection was accepted by a ServerSocketChannel.

    } else if (key.isConnectable()) {
        // a connection was established with a remote server.

    } else if (key.isReadable()) {
        // a channel is ready for reading

    } else if (key.isWritable()) {
        // a channel is ready for writing
    }

    keyIterator.remove();
}

需要说明的是,select() 方法仅仅是简单地将就绪的IO操作放到了set<selectionKey>集合中,并且用完后自己不会删除,因此我们每次在迭代中都要手动的调用 keyIterator.remove() 方法将这个key删除。例如:我们在收到OP_ACCEPT 通知, 然后我们进行相关处理, 但是并没有将这个 Key 从 SelectedKeys 中删除, 那么下一次 select() 返回时 我们还可以在 SelectedKeys 中获取到 OP_ACCEPT 的 key.

第三:

关于在不同监听事件中,key.channel()返回对象的区分;

if (key.isAcceptable()) {
      // 当 OP_ACCEPT 事件到来时, 我们就有从 ServerSocketChannel 中获取一个 SocketChannel,
      //注意, 在 OP_ACCEPT 事件中, 从 key.channel() 返回的 Channel 是 ServerSocketChannel.
      // 而在 OP_WRITE 和 OP_READ 中, 从 key.channel() 返回的是 SocketChannel.
      SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();
      clientChannel.configureBlocking(false);
      // 在 OP_ACCEPT 到来时, 再将这个 Channel 的 OP_READ 注册到 Selector 中.
      // 注意, 这里我们如果没有设置 OP_READ 的话, 即 interest set 仍然是 OP_CONNECT 的话, 
      // 那么 select 方法会一直直接返回.
      clientChannel.register(key.selector(), OP_READ, ByteBuffer.allocate(BUF_SIZE));
 }











服务端以NIO的方式处理请求的Demo 服务端以NIO的方式处理请求的Demo,源码及详细注释 立即下载

相关推荐

TCPClient:使用SwiftNIO的TCPClient

TCP客户端 使用SwiftNIO的TCP客户端示例。 入门 启动TCP服务器以侦听连接(例如 ) 克隆仓库 打开TCPClient.xcodeproj 选择要在My Mac上运行的TCPClient方案默认端口设置为3010 生成并运行

NIO服务端创建过程

NIO服务端创建过程 //步骤1: 打开ServerSocketChannel, 用于监听客户端的连接,它是所有客户端连接的父管道,代码示例如下。 ServerSocketChannel acceptSvr = ServerSocketChannel.open(); //步骤2:绑定监听端口,设置连接为非阻塞模式,示例代码如下: acceptSvr.socket().bind(new Inet...

e31006的博客 377

OC与Swift混编Demo

Swift与OC混编,其中涉及到具体项目配置及其代码举例。

Java中Nio编程实现网络编程的多客户端与服务器连接完整步骤

前言: 物联网答辩终于结束了 记一下自己网络编程的代码 重连代码写了好久 try catch原来可以这么用! 学习地址:https://www.bilibili.com/video/BV1gz4y1C7RK 项目结构: 1、服务器代码: package Server; import Entiles.User; import Utils.JdbcUtil; import java.io.IOException; import java.net.InetSocketAddress; import ja

TGA麻辣香锅的博客 5819

一个NIO服务端,客户端的例子

一个NIO服务端,客户端的例子

论文阅读------Exposure Fusion: A Simple and Practical Alternative to High Dynamic Range Photography

Mertens T, Kautz J, Van Reeth F. Exposure fusion: A simple and practical alternative to high dynamic range photography[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing Ltd, 2009, 28(1): 161-171. 摘要 本文提出了一种将包围曝光的序列融合到高质量图像中的技术,而无需先转换为高动态范围(HD.

qq_25283239的博客 3395

Socket(NIO)实现的客户端与服务端之间通信

NIO实现的客户端与服务端之间通信

woaiwojialanxi的专栏 1718

基于PWM的汽车仪表步进电机微步驱动优化实践

本文深入探讨了基于PWM的微步驱动技术,用于优化汽车仪表步进电机的运行性能。通过将传统的分步驱动升级为PWM微步细分驱动,利用正弦/余弦查表法合成旋转磁场,有效消除了指针抖动与噪声,实现了指针的平滑、精准运动。文章以STM32和VID2905电机为例,提供了详细的硬件连接、代码实现及高级优化技巧,为提升汽车仪表体验提供了实用方案。

weixin_29169505的博客 510

利用Java NIO实现简单的服务器与客户端通讯

Java NIO(New I/O)是 Java 编程语言中用于非阻塞 IO 操作的一组 API。它提供了更为灵活和高效的 IO 操作方式, 特别适用于网络编程和需要高性能的 I/O 场景。

book_dw5189的博客 1122

Infineon MOSFET开关损耗计算实战指南

本文是英飞凌MOSFET开关损耗计算的实战指南。针对MOSFET发热问题,文章深入剖析了开关损耗的产生机理,并基于Infineon数据手册的关键参数,手把手推导了开通与关断损耗的工程计算公式。同时,指南强调了栅极电阻、寄生参数等实际因素对损耗的影响,并提供了从理论计算到实测优化的完整路径,帮助工程师精准评估与优化电源设计。

weixin_29212867的博客 440

本地大模型5:在pycharm用python调用ollama本地大模型

python调用ollama本地大模型

weixin_74825941的博客 8375

Java 网络编程之TCP(三):基于NIO实现服务端,BIO实现客户端

3.Selector:选择器,就是Linux 内核中的IO多路复用器,为了提高网络IO编程的效率,常用的有select, poll, epoll, 可以参考Linux对应系统调用。前面的文章,我们讲述了BIO的概念,以及编程模型,由于BIO中服务器端的一些阻塞的点,导致服务端对于每一个客户端连接,都要开辟一个线程来处理,导致资源浪费,效率低。先开启服务端,再开启两个客户端发送数据,服务端接受连接后,会打印当前接受到的客户端总数,然后轮询接收数据后打印;客户端:基于BIO,连接服务端,并发送数据。

u013771019的专栏 1159

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 677

NIO 客户端与服务端通信demo

public class NioServer { private static final int SERVERPORT = 8080; public static void main(String[] args) { Selector selector = null; ServerSocketChannel server = null;

liujn347的专栏 602

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1659

Windows 10/11蓝屏急救:SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION报错全攻略(附安全模式+CMD修复)

本文针对Windows 10/11系统常见的SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION蓝屏报错,提供了从诊断到修复的完整解决方案。文章深入剖析了该错误与系统安全功能“内存完整性”及pci.sys驱动的关系,并详细指导用户如何通过安全模式进行基础修复,以及使用命令提示符执行高级系统文件修复和注册表修改,帮助用户彻底解决蓝屏问题并恢复系统稳定。

echo99的专栏 968

NIO、ServerSocketChannel常用方法、NIO方式实现客户端与服务端通信demo

ServerSocket是-BIO的网络编程通信方式 ServerSocketChannel-NIO(new io)是新的IO网络编程通信方式,他和BIO最大不同在于NIO是异步的方式,而BIO是同步的方式 ServerSocketChannel:用于面向流的侦听套接字可选通道 类树形图 ServerSocketChannel常用方法: SocketChannel accept():接受此频道...

mosterRan的博客 708

YOLO26 魔术师专栏|全网独家首发!2026 原创级创新赋能 CV 全场景

基于 YOLO26 核心架构迭代,融合原创自研、2026 AAAI/CVPR/ICCV 顶会前沿成果,打造更高效、更灵活、更具创新性的计算机视觉解决方案!

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4356

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java nio socket 例子_java NIO socket 通信实例

java Nio 通信与Bio通信主要不同点:1.Nio中的单个channel就可以支持读操作也能够支持写操作,而bio中读操作要用inputstream,写操作要outputstream.2.nio 採用byteBuffer 作为内存缓存区,向channel里写或者度操作,bio基本是用byte[]3.nio採用 selector组件轮询读取就绪channel服务端demo代码:package ...

weixin_30390951的博客 191

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

azw3 netty权威指南_Netty是业界最流行的NIO框架之一:初识Netty

为什么使用NettyNetty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性、可扩展性在同类框架中都是首屈一指的,它已经得到了成百上千的商用项目的证明。对于为什么使用Netty这个话题,我们先看一下使用原生的NIO有什么缺点:NIO的类库和API繁杂,使用麻烦,需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等,...

weixin_39972264的博客 84

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Mina入门demo

初识Mina,简要记录理解内容和实现demo。 这里先简述一下BIO和NIO的区别: 同步阻塞IO(BIO):一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善。同步非阻塞IO(NIO):一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行...

weixin_30699955的博客 191

java nio connect_java nio java.net.ConnectException: Connection refused: no further information

我用javanio写了个服务器demo,和一个clientdemo,启动服务端后,启动客户端,成功连接服务器,可以发送消息和接收消息了。然后将客户断关闭,再次发起连接时,在检查channel是否连接成功...我用java nio写了个服务器demo,和一个client demo,启动服务端后,启动客户端,成功连接服务器,可以发送消息和接收消息了。然后将客户断关闭,再次发起连接时,在检查chann...

weixin_35657965的博客 302

java 长连接 心跳_Netty实现服务端客户端长连接通讯及心跳检测

Minma是英文Minma Is Not Mina的简称该框架采用Java NIO的核心技术,实现了基于事件驱动的多线程异步通信框架,支持常见的长连接(腾讯QQ)和短连接(http通信)对于开发人员而言,所有的底层技术都是透明的,开发人员仅仅只需要处理业务逻辑,把复杂的NIO简化成了类似Java Swing事件驱动式的编程。长连接实例图具体通信流程1.客户端连接服务端,服务端通过Selector接...

weixin_39643679的博客 391

Netty1:初识Netty

为什么使用Netty Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性、可扩展性在同类框架中都是首屈一指的,它已经得到了成百上千的商用项目的证明。对于为什么使用Netty这个话题,我们先看一下使用原生的NIO有什么缺点: NIO的类库和API繁杂,使用麻烦,需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBu...

weixin_30852451的博客 64

FP通信框架入门使用

        一个自己倒腾的简单的通信框架(目前只是基于请求响应模式),集成底层的API,目的在于提高通信层的开发效率。该通信框架包括如下几个功能:         1.服务端采用NIO模式,提高通信速率         2.内部提供可选连接池方式,尽可能的将连接重用,提高开发效率。         3.提供过滤器自定义         4.业务处理层自定义         5.提供负...

小蠢鱼的专栏 582
上一篇: Linux开启ssh服务
下一篇: Jdk6 7 9 流关闭的新姿势
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值