Java >> Java tutorial >  >> Tag >> java.net

NIO-klient giver undtagelse:java.net.ConnectException:Forbindelse nægtet:ingen yderligere information

ConnectException: connection refused betyder, at intet lyttede på den IP:port, du forsøgte at oprette forbindelse til, eller på nogle platforme, som serverens lytte-backlog-kø fyldte op. Hvis den bliver smidt, og du fanger den rigtigt, vil du helt sikkert fange den. Du bliver nødt til at uddybe, hvad der rent faktisk sker, og hvordan din faktiske fangstkode ser ud for yderligere hjælp.

Men du har mange andre problemer:

private void connect(SelectionKey key) throws IOException {
    SocketChannel channel = (SocketChannel) key.channel();
    try
    {
        if(!channel.finishConnect())
            System.out.println("* Here *");

På dette tidspunkt, hvis finishConnect() returneres falsk, skal du vende tilbage. Du bør ikke falde igennem og genregistrer kanalen for OP_WRITE. Forbindelsen afventer stadig. Udskriver "* Here *" er også ret forgæves. Prøv at udskrive noget meningsfuldt.

    }
    catch(ConnectException e)
    {
        System.out.println("BP 1");
        e.printStackTrace();

        //channel.close();

Du bør helt sikkert lukke kanalen på dette tidspunkt. Det er ikke til nogen nytte for mennesker eller dyr.

        //key.cancel();

Lukning af kanalen annullerer tasten. Fjern alle steder, du støder på.

        //return;

Som ovenfor skal du helt sikkert vende tilbage på dette tidspunkt.

    }
    /*if (channel.isConnectionPending()){
        while(!channel.ffinishConnect()){
            System.out.println("not connected");
        }
    }*/

Slip af med dette lort. Det er aldrig hensigtsmæssigt at spin-loop i ikke-blokerende tilstand. Lad det ikke engang ligge som kommentarer:en eller anden idiot kommer måske senere og leger med at lægge den tilbage.

    channel.configureBlocking(false);

Kanalen er allerede i ikke-blokerende tilstand. Ellers ville du ikke være her. Fjern.

    channel.register(selector, SelectionKey.OP_WRITE);

En anden måde at gøre det på er key.interestOps(SelectionKey.OP_WRITE);

At sove i netværkskode er bogstaveligt talt spild af tid. Det løser ikke noget.

Du antager, at write() lykkedes fuldstændigt, og du ignorerer den optælling, den returnerer.

Du bruger en reference af ret dårlig kvalitet:

  • Samme bemærkninger om write() gælder som ovenfor.
  • flip() er ikke 'som en nulstilling'.
  • Når du annullerer en nøgle, lukkes kanalen.
  • Du behøver ikke at slette en helt ny ByteBuffer, men under alle omstændigheder tildele en ByteBuffer pr. læsning er dårlig praksis.
  • ServerSocketChannel.accept() kan returnere null.
  • Koden, der viser en streng efter læsning, er forkert.
  • Der er ingen grund til at bruge en Map når nøgler har vedhæftede filer.
  • Der er ingen grund til at blive ved med at teste Thread.interrupted() når NIO alligevel er afbrydelig.
  • Der er ingen grund til at lukke alt, bare på grund af én IOException på én kanal.

Prøv at finde noget bedre.


Java tag