socket nio 多线程接收客户端信息
来源:互联网 发布:垃圾对人类的危害数据 编辑:程序博客网 时间:2024/05/22 11:03
在连接数很大的情况下,使用Selector能减少并发线程数,减少上下文切换的消耗,非阻塞IO使得具备流程的读写。
package main; import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;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.nio.charset.Charset;import java.util.Iterator;import java.util.Set;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; public class Server { private final int PORT = 1234; private ExecutorService pool; private ServerSocketChannel ssc; private Selector selector; private static Charset charset = Charset.forName("utf-8"); private int n; public static void main(String[] args) throws IOException{ Server server = new Server(); server.doService(); } public Server() throws IOException{ pool = Executors.newFixedThreadPool(5); ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ServerSocket ss = ssc.socket(); ss.bind(new InetSocketAddress(PORT)); selector = Selector.open(); ssc.register(selector,SelectionKey.OP_ACCEPT); System.out.println("Server started..."); } public void doService(){ while(true){ try{ n = selector.select(); }catch (IOException e) { throw new RuntimeException("Selector.select()异常!"); } if(n==0) continue; Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> iter = keys.iterator(); while(iter.hasNext()){ SelectionKey key = iter.next(); iter.remove(); if(key.isAcceptable()){ SocketChannel sc = null; try{ sc = ((ServerSocketChannel)key.channel()).accept(); sc.configureBlocking(false); System.out.println("客户端:"+sc.socket().getInetAddress().getHostAddress()+" 已连接"); SelectionKey k = sc.register(selector, SelectionKey.OP_READ); ByteBuffer buf = ByteBuffer.allocate(1024); k.attach(buf); }catch (Exception e) { try{ sc.close(); }catch (Exception ex) { } } } else if(key.isReadable()){ key.interestOps(key.interestOps()&(~SelectionKey.OP_READ)); pool.execute(new Worker(key)); } } } } public static class Worker implements Runnable{ private SelectionKey key; public Worker(SelectionKey key){ this.key = key; } @Override public void run() { SocketChannel sc = (SocketChannel)key.channel(); ByteBuffer buf = (ByteBuffer)key.attachment(); buf.clear(); int len = 0; try{ while((len=sc.read(buf))>0){//非阻塞,立刻读取缓冲区可用字节 buf.flip(); System.out.println("客户端:"+charset.decode(buf).toString()); buf.clear(); } if(len==-1){ System.out.println("客户端断开。。。"); sc.close(); } //没有可用字节,继续监听OP_READ key.interestOps(key.interestOps()|SelectionKey.OP_READ); key.selector().wakeup(); }catch (Exception e) { try { sc.close(); } catch (IOException e1) { } } } }}
0 0
- socket nio 多线程接收客户端信息
- socket客户端接收信息被堵塞
- 为什么ServerSocket接收不到客户端Socket发送的信息?
- java socket客户端发信息,服务器接收并反馈。
- NIO客户端(多线程)
- socket接收发送信息
- linux多线程socket客户端
- c++服务器通过socket接收安卓客户端发来信息时乱码的处理
- java socket多线程 接收xml
- JavaSE练习-多线程、Socket(TCP协议)、IO流模拟实现服务端多线程接收客户端上传图片
- 局域网聊天工具(多线程),支持客户端与客户端间通信,服务器负责信息的接收与发送
- 局域网聊天工具(多线程),支持客户端与客户端间通信,服务器负责信息的接收与发送(client)
- PHP SOCKET 服务器端接收客户端请求
- Python入门:socket连续接收客户端数据
- java nio socket实现多线程多用户通信
- socket客户端发送信息举例
- Java Socket多线程服务端、客户端
- Java Socket多线程服务端、客户端
- 操作系统习题
- 大陆怎么登陆谷歌和Gmail邮箱?【外游VPN登陆注册谷歌】
- Android 用户界面编程技巧
- 多线程编程--5种方法实现线程同步
- 《C#程序设计》猜猜看小游戏制作
- socket nio 多线程接收客户端信息
- 用Lua编写iOS程序
- iOS开发之UITableView的滚动优化以及隐藏特性的使用
- 自动派生
- Navicat导出mysql的查询结果为Excel文档
- (转)informatica 面试题大全
- C语言之基本算法11—牛顿迭代法求平方根
- leetcode 45:Jump Game II
- 利用虚拟机分区扩展hdfs hard disk 存储(ubuntu12.10)