首页 > 解决方案 > 客户端无法连接到服务器

问题描述

我有一些在 java 中使用 nio 的服务器和客户端代码。当我尝试连接到服务器sctpChannel.connect(new InetSocketAddress("127.0.0.1",4545));时返回 false。并selector.select()返回 0 。我不知道为什么会这样。

public class SctpNioServer {
public static void main(String[] args)throws  Exception{
    InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost",4545);
    SctpServerChannel serverChannel = SctpServerChannel.open();
    serverChannel.bind(inetSocketAddress);
    serverChannel.configureBlocking(false);
    Selector selector = Selector.open();
    serverChannel.register(selector,SelectionKey.OP_ACCEPT );
    while(true){
        try{
            selector.select();
            Set<SelectionKey> selectedKeys = selector.selectedKeys() ;
            Iterator<SelectionKey> iterator = selectedKeys.iterator();
            while (iterator.hasNext()){
                SelectionKey key = iterator.next();
                iterator.remove();
                if(key.isAcceptable()){
                    SctpChannel channel = serverChannel.accept();
                    channel.configureBlocking(false) ;
                    channel.register(selector,SelectionKey.OP_READ);
                }
                if (key.isReadable()){
                    SctpChannel channel = (SctpChannel) key.channel();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(4096);
                    channel.receive(byteBuffer,null,null);
                    byteBuffer.flip();
                    while (byteBuffer.hasRemaining()){
                        System.out.println((char)byteBuffer.get());
                    }
                    byteBuffer.clear();
                    channel.register(selector, SelectionKey.OP_WRITE);
                }
                if(key.isWritable()){
                    //doSomething
                }
            }
            selector.wakeup();
        }
        catch (IOException e){
            e.printStackTrace();
        }
        finally {
            serverChannel.close();
        }
    }
}}

public class SctpNioClient  {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    try {
        SctpChannel channel = SctpChannel.open();
        channel.configureBlocking(false);
        channel.connect(new InetSocketAddress("localhost", 4545));
        Selector sel = Selector.open();
        channel.register(sel, SelectionKey.OP_CONNECT);
        while (true) {
            if (sel.isOpen()) {
                int keys = sel.select(5);
                if (keys > 0) {
                    Set<SelectionKey> selectedKeys = sel.selectedKeys();
                    for (SelectionKey sk : selectedKeys) {
                        if (!sk.isValid()) {
                            break;
                        }
                        if (sk.isConnectable()) {
                            channel.finishConnect();
                            channel.register(sel, SelectionKey.OP_WRITE, channel);
                        }
                        if (sk.isWritable()) {
                            SctpChannel ch = (SctpChannel) sk.channel();
                            System.out.println("writing->");
                            ByteBuffer byteBuffer = ByteBuffer.allocate(4096);
                            String text = scanner.nextLine();
                            byteBuffer.clear();
                            byteBuffer.put(text.getBytes());
                            byteBuffer.flip();
                            MessageInfo messageInfo = MessageInfo.createOutgoing(null,null,0);
                            ch.send(byteBuffer,messageInfo);
                            ch.register(sel , SelectionKey.OP_READ);
                            sel.wakeup();
                        }
                        if(sk.isReadable()){
                            SctpChannel ch = (SctpChannel) sk.channel();
                            ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                            ch.receive(byteBuffer,null,null);
                            byteBuffer.flip();
                            while (byteBuffer.hasRemaining()){
                                System.out.println((char)byteBuffer.get());
                            }
                            ch.register(sel,SelectionKey.OP_WRITE);
                        } } } } }
    } catch (IOException ex) { }
}}

标签: javaconnectionclient-serverniosctp

解决方案


  1. connect()返回一个布尔值。您声称它是错误的,但您的代码忽略了它。
  2. 如果它返回true,您不需要注册OP_CONNECT: 但是当您忽略它时,您也忽略了这个事实。
  3. finishConnect() 返回一个布尔值,您也忽略了它。
  4. 所有这些操作都可以 throw IOExceptions,你忽略了。

解决方案:不要。在所有情况下。


推荐阅读