2015-10-08 33 views
0
package server; 

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; 

public class Server { 
    public static void main(String... args) throws IOException { 
     ServerSocketChannel server = ServerSocketChannel.open(); 
     server.configureBlocking(false); 
     server.socket().bind(new InetSocketAddress(64000)); 
     Selector selector = Selector.open(); 
     server.register(selector, SelectionKey.OP_ACCEPT); 
     while(server.isOpen()){ 
      selector.select(); 
      for(SelectionKey key : selector.selectedKeys()){ 
       if(key.isAcceptable()){ 
        SocketChannel socket = server.accept(); 
        socket.configureBlocking(false); 
        socket.register(selector, SelectionKey.OP_READ); 
       } 
       if(key.isReadable()){ 
        SocketChannel socket = (SocketChannel)key.channel(); 
        ByteBuffer socketbuffer = ByteBuffer.allocate(100); 
        int read = socket.read(socketbuffer); 
        byte[]stringarray = socketbuffer.array(); 
        socket.write(ByteBuffer.wrap(stringarray, 0, read)); 
        System.out.print(new String(stringarray, 0, read)); 
       } 
       selector.selectedKeys().remove(key); 
      } 
     } 
    } 
} 

一切处理索引越界异常的工作真的很好,直到我退出,从客户端连接它给这个错误如何从ByteBuffer

Exception in thread "main" java.lang.IndexOutOfBoundsException 
at java.nio.ByteBuffer.wrap(ByteBuffer.java:375) 
at server.Server.main(Server.java:31) 

Java结果:1

,当我得到这个错误它关闭了我用telnet连接的所有套接字

+0

你想做什么?你知道'IndexOutOfBoundsException'是什么吗?你知道为什么它被扔在你的案件? –

+0

当我用命令telnet localhost 64000关闭telnet窗口时,程序崩溃。我想修复崩溃,所以它不会发生。 –

回答

1

您不检查socket.read()的返回值,如果已到达流结尾,它将返回-1返回值 http://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html#read(java.nio.ByteBuffer)

尝试添加该

int read = socket.read(socketbuffer); //after here 
if(read == -1){ 
    socket.close(); 
}else{ //the logic is weird after this so I just changed it 
    socketbuffer.flip(); 
    System.out.print(new String(socketbuffer.array(), socketbuffer.position(), socketbuffer.limit())); 
    socket.write(socketbuffer); 
    socketbuffer.clear(); 

} 

您也应该检查是否的关键是使用它之前有效。

+0

关闭通道就足够了。它取消了密钥。你不需要这样做。在写入之后,您还必须“压缩()”或“清除()”ByteBuffer。 – EJP