`

java模拟selector的附带功能

    博客分类:
  • java
阅读更多
package com.event;

import java.util.Map;

public interface EventListener {

void onEvent(Map event);
}



package com.socket;

import java.nio.ByteBuffer;
import java.util.HashMap;

import com.event.EventListener;
/*
* 预处理类
*/
public class BaseObject {

private boolean flag;
private ByteBuffer receivebuffer= ByteBuffer.allocate(20000);

public void print(){
System.out.println("hello!");
flag=true;
}

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}
public ByteBuffer getReceivebuffer() {
return receivebuffer;
}


public void invoke(EventListener event){

System.out.println("BaseObject invoke");
HashMap<String, String> map=new HashMap<String, String>();
map.put("key", "wellcome here");
event.onEvent(map);
}
}


package com.socket;


public class Client{


     /*
      * 对应的远程客户端
      */
public Client(){


}
public void run( ) {

System.out.println("client run");

}




}


package com.socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class Server {

private ServerSocketChannel channel;
private SocketController sc;

public Server() {
try {
sc = new SocketController();
sc.start();
channel = ServerSocketChannel.open();
channel.socket().bind(new InetSocketAddress(8080));
} catch (IOException e) {
e.printStackTrace();
}

}

private void start() {
try {
while (true) {
try {
SocketChannel socket = channel.accept();
socket.configureBlocking(false);
sc.registerSocket(socket);
} catch (IOException e) {
e.printStackTrace();
}

}
} catch (Exception e) {
e.printStackTrace();
}
}


public static void main(String[] args) {
new Server().start();
}
}



package com.socket;

import java.nio.channels.SocketChannel;


public class SocketConnector {

private  SocketChannel socket;
private  Object attachment;


public SocketConnector(SocketChannel socket,Object attachment){
this.socket=socket;
this.attachment=attachment;
}

public  SocketChannel getSocket() {
return socket;
}

public void setSocket(SocketChannel socket){
this.socket=socket;
}
public  Object getAttachment() {
return attachment;
}

public void attach(Object attach){
this.attachment=attach;
}



}

package com.socket;

import java.io.IOException;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Map;

import com.event.EventListener;

/*
* 模拟selector的简单处理类
*/
public class SocketController extends Thread {

private ArrayList<SocketConnector> clients;
private ArrayList<SocketConnector> oldClients;
private ArrayList<SocketConnector> newClients;

private boolean change;
public static Object sync;

public SocketController() {
clients = new ArrayList<SocketConnector>();
oldClients = new ArrayList<SocketConnector>();
newClients = new ArrayList<SocketConnector>();
change = false;
sync = new Object();
}

public void run() {

while (true) {

if (change) {
synchronized (sync) {
clients.removeAll(oldClients);
clients.addAll(newClients);

newClients.clear();
oldClients.clear();
change = false;

}

}

for (int i = 0; i < clients.size(); i++) {

final SocketConnector sc = clients.get(i);
Object obj = sc.getAttachment();
final SocketChannel socket = sc.getSocket();

if (obj instanceof BaseObject) {

BaseObject bo = (BaseObject) obj;

if (!bo.isFlag()) {
bo.print();

} else {

try {

socket.read(bo.getReceivebuffer());
// 加入处理逻辑
bo.getReceivebuffer().clear();

bo.invoke(new EventListener() {

@Override
public void onEvent(Map event) {
System.out.println("invoke return:"
+ event.get("key"));
// 预处理通过,则生成对应的客户端类
Client client = new Client();

sc.attach(client);
}

});

} catch (IOException e) {
e.printStackTrace();
}

}
}

if (obj instanceof Client) {
Client client = (Client) obj;
client.run();
}

}
try {
Thread.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

public void registerSocket(SocketChannel socket) {
BaseObject hsp = new BaseObject();
SocketConnector sc = new SocketConnector(socket, hsp);
synchronized (sync) {
newClients.add(sc);
change = true;
}

}

public void unRegisterSocket(SocketConnector sc){
synchronized (sync) {
oldClients.add(sc);
change = true;
}
}

}


0
0
分享到:
评论

相关推荐

    java selector 测试并发

    Java Selector的核心类包括`Selector`、`SelectionKey`和`SelectableChannel`。`Selector`是实际进行选择操作的对象,它可以注册多个`SelectableChannel`(如SocketChannel)。当这些通道准备进行读写、连接或接受...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    java selector类的用法举例

    ### Java NIO Selector 类的用法详解 #### 一、引言 在Java网络编程中,随着并发连接数量的增长,传统的基于`ServerSocket`和`Socket`的方式在处理大量连接时变得效率低下。为此,Java引入了非阻塞I/O模型(Non-...

    Java NIO——Selector机制解析三(源码分析)

    本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...

    java nio Selector的使用-客户端

    Selector是Java NIO中的核心组件之一,它允许单个线程处理多个通道(channels)的读写事件,极大地提高了服务器的并发能力。本篇文章将深入探讨如何在Java NIO中使用Selector处理客户端的I/O请求。 首先,我们需要...

    Java模拟题 Java题库

    这里提供的“Java模拟题 Java题库”包含了10套完整的Java练习题目,每套都配有详细的答案,为学习者提供了宝贵的实践机会。 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、控制结构(如if语句、for...

    java基于NIO选择器Selector的多人聊天室

    画板功能可能涉及`java.awt.Canvas`或`javax.swing.JComponent`的子类,用于绘制特定的图形或信息。 在聊天室的实现中,服务器端和客户端都需要维护一个线程安全的数据结构,如`ConcurrentHashMap`,来存储在线用户...

    Java_NIO-Selector.rar_java nio_selector

    Selector的主要功能是监控多个通道的状态变化,例如连接建立、数据到达或者关闭等事件。通过注册感兴趣的事件类型到Selector,程序可以在一个线程中处理多个通道的I/O操作,避免了创建大量线程导致的资源浪费和上...

    Java NIO Selector选择器简介.pdf

    ### Java NIO Selector选择器详解 #### 一、Selector概览及作用 **Selector** 是 Java NIO (New I/O) 框架中的一个重要组成部分,主要用于检测一个或多个 **NIO Channel** 的状态,包括但不限于可读、可写、可连接...

    java nio Selector的使用-服务器端

    Selector是Java NIO中的核心组件,用于监听多个通道的事件,如连接建立、数据可读、写空等。在服务器端,Selector的应用尤为重要,因为它可以实现单线程处理多个客户端连接,从而提高系统的并发能力。 Selector的...

    Java Selector-开源

    Java Selector 是一个由Red Hat开发的开源工具,其主要功能是为用户提供了一个便捷的界面,以便在计算机上安装的不同Java版本之间轻松切换。这个工具对于开发者尤其有用,因为不同的项目可能依赖于特定版本的Java...

    Java_NIO类库Selector机制解析.doc

    Java_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.docJava_NIO类库Selector机制解析.doc

    JAVA代码设置selector不同状态下的背景颜色

    JAVA代码设置selector不同状态下的背景颜色 在Android开发中,设置按钮或视图的背景颜色是一项常见的需求,特别是在不同的状态下,例如 presses、Focused、Selected 等状态。JAVA代码设置selector不同状态下的背景...

    Java-NIO类库Selector机制解析.docx

    "Java NIO Selector 机制解析" Java NIO(New I/O)类库是Java 1.4版本以后引入的新一代I/O机制,相比传统的I/O机制,NIO提供了高效、异步、多路复用的I/O操作模式。Selector机制是NIO类库中的一种核心机制,用于...

    JavaNIO库Selector机制解析.docx

    JavaNIO库Selector机制解析.docx

    java api之Selector基础、应用场景、实战讲解

    java api之Selector基础、应用场景、实战讲解

    Java NIO Selector用法详解【含多人聊天室实例】

    Selector是Java NIO中的关键组件,用于实现多路复用,即单个线程可以监控多个通道(Channel)的事件,例如读取、写入或连接等。 1. Java NIO Channel与Buffer Channel代表I/O操作的源或目标,如文件、套接字等。...

    Java-NIO之Selector.doc

    Java NIO(非阻塞I/O)中的Selector是一个核心组件,它允许单个线程处理多个通道(channels)上的I/O事件。Selector的角色就像一个交通指挥员,能够监控多个通道并决定哪个通道准备好进行读写操作,从而提高系统的...

    flutter file-selector

    在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中...

    Java_Picture Selector Library for Android or 图片选择器.zip

    【Java_Picture Selector Library for Android】是一个专门为Android平台设计的图片选择库,它为开发者提供了一个用户友好的界面,使得用户在应用中可以方便地选择、裁剪和预览图片。这个库通常用于社交应用、图像...

Global site tag (gtag.js) - Google Analytics