客户端无法连接到服务器 [英] Client doesn't connect to server

查看:228
本文介绍了客户端无法连接到服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些在java中使用nio的服务器和客户端代码。当我尝试连接到服务器 sctpChannel.connect(new InetSocketAddress(127.0.0.1,4545)); 返回false。并且 selector.select()返回0。我无法弄清楚它为什么会发生。

I have some server and client code that use nio in java. When I try connected to the server sctpChannel.connect(new InetSocketAddress("127.0.0.1",4545)); returns false. And selector.select() returns 0 . I can't figure out why it happens.

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) { }
}}


推荐答案


  1. connect()返回一个布尔值。你声称它是假的,但是你的代码会忽略它。

  2. 如果它返回 true ,你不需要注册 OP_CONNECT :但是你忽略了它,你也忽略了这个事实。

  3. finishConnect() 返回一个布尔值,你也忽略了它。

  4. 所有这些操作都可以抛出 IOExceptions ,你 忽略。

  1. connect() returns a boolean. You claim that it is false, but your code ignores it.
  2. If it returns true, you don't need to register for OP_CONNECT: but as you are ignoring it you are also ignoring this fact.
  3. finishConnect() also returns a boolean, which you are also ignoring.
  4. All these operations can throw IOExceptions, which you are also ignoring.

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

Solution: don't. In all cases.

这篇关于客户端无法连接到服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆