非阻塞socket服务器示例

来源:互联网 发布:男装淘宝店 编辑:程序博客网 时间:2024/06/04 00:22

最近看了看NIO,写了一下代码,感觉还不错。

package cn.jpy.test;



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.util.Date;
import java.util.Iterator;
import java.util.Set;


public class SelecterTest {
public static void main(String[] args) {
try {
socketTest();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void socketTest() throws IOException{
int[] ports = {6961, 6962, 6963, 6964};
Selector selector = Selector.open();
for (int port : ports) {
ServerSocketChannel serverSocketChannel = null;
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
ServerSocket server = serverSocketChannel.socket();
InetSocketAddress address = null;
address = new InetSocketAddress(port);
server.bind(address);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("服务器正在运行");
}

while (selector.select() > 0) {
Set<SelectionKey> selectKeys = selector.selectedKeys();
Iterator<SelectionKey> iter = selectKeys.iterator();
while (iter.hasNext()) {
SelectionKey selectionKey = (SelectionKey) iter.next();
if(selectionKey.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
SocketChannel client = server.accept();
client.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(("当前时间" + new Date()).getBytes());
buffer.flip();
client.write(buffer);
client.close();
}
}
selectKeys.clear();
}
}
}
0 0