首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

NIO有关问题!请各位大侠帮忙解决下性能有关问题

2011-12-12 
NIO问题!!请各位大侠帮忙解决下性能问题[color#FF0000]我写了个简单的demo但是当客户端连接到服务时cup就

NIO问题!!请各位大侠帮忙解决下性能问题
[color=#FF0000]我写了个简单的demo但是当客户端连接到服务时cup就上涨到50%了。[/color]
Server类:

public   class   ServerSocket   {
Selector   selector   =   null;
ServerSocketChannel   ssc   =   null;
private   Charset   charset   =   Charset.forName( "GBK ");

public   static   void   main(String[]   args)   {
ServerSocket   server=new   ServerSocket();
try   {
server.server();
}   catch   (IOException   e)   {
e.printStackTrace();
}
}

public   ServerSocket()   {
try   {
ssc   =   ServerSocketChannel.open();
java.net.ServerSocket   serversocket   =   ssc.socket();
serversocket.setReuseAddress(true);
serversocket.bind(new   InetSocketAddress( "192.168.0.159 ",   9999));
ssc.configureBlocking(false);
selector   =   Selector.open();

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

public   void   server()   throws   IOException   {
ssc.register(selector,   SelectionKey.OP_ACCEPT);
while   (selector.select()> 0)   {
Set <SelectionKey>   seletorKey   =   selector.selectedKeys();
Iterator <SelectionKey>   it   =   seletorKey.iterator();
while   (it.hasNext())   {
SelectionKey   key   =   null;
try   {
key   =   it.next();
it.remove();
if   (key.isAcceptable())   {
ServerSocketChannel   ss   =   (ServerSocketChannel)
                                                                                                                                              key.channel();
SocketChannel   socketChannel   =   ss.accept();
socketChannel.configureBlocking(false);
ByteBuffer   buffer   =   ByteBuffer.allocate(1024);
socketChannel.register(selector,   SelectionKey.OP_READ
|   SelectionKey.OP_WRITE,   buffer);

}
if   (key.isReadable())   {
                                          //receive(key);
}
if   (key.isWritable())   {
//send(key);
}
}   catch   (Exception   e)   {
if   (key   !=   null)   {
key.cancel();
key.channel().close();
}
}
}
}
}
public   static   void   main(String[]   args)   {
        ServerSocket   server=new   ServerSocket();
try   {
server.server();
}   catch   (IOException   e)   {
e.printStackTrace();
}
}
}

client类:

public   class   SocketClient   {

private   SocketChannel   socketChannel   =   null;
private   ByteBuffer   sendBuffer   =   ByteBuffer.allocate(1024);


private   ByteBuffer   receiveBuffer   =   ByteBuffer.allocate(1024);
private   Charset   charset   =   Charset.forName( "GBK ");
private   Selector   selector;

public   SocketClient()   throws   IOException   {
socketChannel   =   SocketChannel.open();
socketChannel.connect(new   InetSocketAddress( "192.168.0.159 ",   9020));
socketChannel.configureBlocking(false);
System.out.println( "与服务器的连接建立成功 ");
selector   =   Selector.open();
}
public   void   server()   throws   IOException   {
socketChannel.register(selector,   SelectionKey.OP_READ
|   SelectionKey.OP_WRITE);
while   (selector.select()   >   0)   {
Set <SelectionKey>   readyKey   =   selector.selectedKeys();
Iterator <SelectionKey>   it   =   readyKey.iterator();
while   (it.hasNext())   {
SelectionKey   key   =   null;
try   {
key   =   it.next();
it.remove();
if   (key.isReadable())   {
//receive(key);
}
if   (key.isWritable())   {
//send(key);
}

}   catch   (Exception   e)   {
if   (key   !=   null)   {
key.cancel();
key.channel().close();
}
}
}
}
}
public   static   void   main(String[]   args)   throws   IOException   {
SocketClient   client   =   new   SocketClient();
client.server();
}
}

[解决办法]
不懂!帮顶
[解决办法]
不要接收到连接就注册SelectionKey.OP_WRITE事件,那个事件基本上管道不堵塞一直就绪的。

先只注册可读事件。

Java code
socketChannel.register(selector, SelectionKey.OP_READ,buffer);
[解决办法]
楼上正解!
[解决办法]
数据写完后,记得将写事件取消掉。
key.interestOps(SelectionKey.OP_READ);
 

[解决办法]
有点要注意一下,关于同步的问题。
定义一个同步变量。
Java code
final Object synchronizedObj = new Object();
[解决办法]
if (key.isReadable()) {
//receive(key); 你要不读取的话, 会一直有读取事件。 死循环。
}

ByteBuffer buffer = ByteBuffer.allocate(1024); 这据代码, 在循环里面, 是会要你命的哦。

热点排行