Nettyサーバーに2回接続できません

manf

私は単純なアプリケーションに取り組んでいます。私は自分の例外を理解しようとしていますが、理解できません。

再現方法:

  1. Nettyサーバーの起動
  2. クライアントを使用したNettyサーバーへの接続->有効な応答、サーバー+クライアントは正常に機能しています。
  3. クライアントが閉じています(0チャネルがアクティブであり、デバッグスレッドによって証明されています)
  4. 新しいクライアントが読み取ろうとします->エラー:java.net.SocketException:ソフトウェアが原因で接続が中止されました:recvが失敗しました
  5. サーバーを再起動し、2に進みます。

サーバーソース:

public class Server {

private final int port;

public Server(int port) {
    this.port = port;
}

public void run() throws Exception {
    final EventLoopGroup boss = new NioEventLoopGroup();
    final EventLoopGroup worker = new NioEventLoopGroup();
    try {
        final ServerBootstrap b = new ServerBootstrap();
        b.group(boss, worker)
                .channel(NioServerSocketChannel.class)
                .childHandler(new SocketChannelInitializer());

        final ChannelFuture f = b.bind(port).sync();
        final ChannelFuture c = f.channel().closeFuture();
        System.out.println("- DONE -");

        c.sync();
    } finally {
        worker.shutdownGracefully();
        boss.shutdownGracefully();
    }
}

public static void main(String[] args) throws Exception {
    int port;
    if (args.length > 0) {
        port = Integer.parseInt(args[0]);
    } else {
        port = 8080;
    }
    new Server(port).run();
}

}

私のイニシャライザー:

public static final String PACKET = "packet";
public static final String STRING_DECODER = "stringDecoder";
public static final String NETWORK_HANDLER = "networkHandler";

@Override
public void initChannel(SocketChannel ch) throws Exception {
    System.out.println("Creating new Channel!");
    final ChannelPipeline p = ch.pipeline();
    p.addLast(NETWORK_HANDLER, new NetworkHandler());
    p.addLast(STRING_DECODER, new StringDecoder(CharsetUtil.UTF_8));
    p.addLast(new Testdecoder());
    p.addLast(new ChatAdapter());
}

サーバーはリクエストを処理しますが、正しいメッセージを読み取ることができません。

私の顧客:

public static void main(String[] args) throws IOException {
    final Socket s = new Socket();
    s.connect(new InetSocketAddress("localhost", 8080));
    final InputStream is = s.getInputStream();
    final OutputStream os = s.getOutputStream();
    os.write(0x0);
    os.write("username".getBytes(CharsetUtil.UTF_8));
    os.flush();
    System.out.println("!");
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    byte[] b = new byte[4096];
    while (true) {
        int n = is.read(b);
        if (n < 0) {
            break;
        }
        baos.write(b, 0, n);
    }

    byte data[] = baos.toByteArray();
    System.out.println(new String(data, CharsetUtil.UTF_8));
    System.out.println("- DONE -");
    s.close();
}

Netty4.0.23.Finalの使用

アプリケーションの例:https//github.com/BjoernAkAManf/Chat

Server.main(String [] args)を起動し、Client.main(String [] args)を2回実行します。最初に適切な出力が得られます。2回目の実行は失敗します。考えられることは何でもテストしました。ここで本当に助けてくれてありがとう。ありがとうございました

manf

私の最初のアイデアにもかかわらず、これは「実際の」サーバーの問題ではなく、nettyの問題でもありません。クライアントはoio(java.IO)ソケットを使用してNioNettyサーバーに接続します。

NioEventLoopGroupをOioEventLoopGroupに変更し、NioServerSocketChannelをOioServerSocketChannelに変更すると、この奇妙な問題が解決されます。

さらに、Nioで動作するようにクライアントを変更することもできます。次の例では、java.nioを使用します。

    final SocketChannel c = SocketChannel.open();
    c.connect(new InetSocketAddress("localhost", 8007));

    final ByteBuffer buf = ByteBuffer.allocate(5);

    // fill Buffer
    buf.put((byte) 0x0);
    buf.put("Test".getBytes(CharsetUtil.UTF_8));
    // Flip buffer
    buf.flip();

    // Write buffer to socket
    while (buf.hasRemaining()) {
        c.write(buf);
    }

    System.out.println("Reading ...");

    // Read 
    buf.flip();
    while (true) {
        int n = c.read(buf);
        if (n < 0) {
            break;
        }
        final String d = new String(buf.array());
        if(!d.isEmpty()) System.out.println("'" + d + "'");
        buf.clear();
    }

    // Finish Programm
    System.out.println("- DONE -");
    c.close();

その例は完全にうまく機能します。明らかに、問題は私の目の前にありました。

今では修正されました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Nettyサーバーに2回接続できません

分類Dev

角度2はサーバーに接続できません

分類Dev

AmazonEC2のノードサーバーに接続できません

分類Dev

xサーバーに接続できませんエラー

分類Dev

ローカルサーバーに接続できません

分類Dev

AWSEC2サーバーにSSH接続できませんでした

分類Dev

dockerでrabbitmqサーバーに接続できません

分類Dev

dockerでpostgresサーバーに接続できません

分類Dev

IntegrationServices経由でサーバーに接続できません

分類Dev

Adiumでejabberdサーバーに接続できません

分類Dev

tryhackmeサーバーにSSHで接続できません

分類Dev

MySqlでWinXpサーバーに接続できません

分類Dev

infiniband経由でサーバーに接続できません

分類Dev

LinuxWebサーバーにSSHで接続できません

分類Dev

sshはVPNでサーバーに接続できません

分類Dev

Nautilus で「サーバーに接続」できません

分類Dev

JavaでSQLサーバーに接続できません

分類Dev

サーバーでSybaseASE16.0に接続できません

分類Dev

ホーム接続からサーバーにSSH接続できません

分類Dev

Symfony2は「192.168.1.50」(113)のMySQLサーバーに接続できません

分類Dev

Windows10からjupyternotebookec2サーバーに接続できません

分類Dev

VPN接続でサーバーにSSH接続できません

分類Dev

VPN接続でサーバーにSSH接続できません

分類Dev

PostgreSQLサーバーに接続できません

分類Dev

サーバー接続拒否にtelnetできません

分類Dev

MySQLWorkbenchをMySQLサーバーに接続できません

分類Dev

SignalR Javaがサーバーに接続できません

分類Dev

Cassandra cqlsh「サーバーに接続できません」

分類Dev

Apacheサーバー上のMySQLに接続できません

Related 関連記事

  1. 1

    Nettyサーバーに2回接続できません

  2. 2

    角度2はサーバーに接続できません

  3. 3

    AmazonEC2のノードサーバーに接続できません

  4. 4

    xサーバーに接続できませんエラー

  5. 5

    ローカルサーバーに接続できません

  6. 6

    AWSEC2サーバーにSSH接続できませんでした

  7. 7

    dockerでrabbitmqサーバーに接続できません

  8. 8

    dockerでpostgresサーバーに接続できません

  9. 9

    IntegrationServices経由でサーバーに接続できません

  10. 10

    Adiumでejabberdサーバーに接続できません

  11. 11

    tryhackmeサーバーにSSHで接続できません

  12. 12

    MySqlでWinXpサーバーに接続できません

  13. 13

    infiniband経由でサーバーに接続できません

  14. 14

    LinuxWebサーバーにSSHで接続できません

  15. 15

    sshはVPNでサーバーに接続できません

  16. 16

    Nautilus で「サーバーに接続」できません

  17. 17

    JavaでSQLサーバーに接続できません

  18. 18

    サーバーでSybaseASE16.0に接続できません

  19. 19

    ホーム接続からサーバーにSSH接続できません

  20. 20

    Symfony2は「192.168.1.50」(113)のMySQLサーバーに接続できません

  21. 21

    Windows10からjupyternotebookec2サーバーに接続できません

  22. 22

    VPN接続でサーバーにSSH接続できません

  23. 23

    VPN接続でサーバーにSSH接続できません

  24. 24

    PostgreSQLサーバーに接続できません

  25. 25

    サーバー接続拒否にtelnetできません

  26. 26

    MySQLWorkbenchをMySQLサーバーに接続できません

  27. 27

    SignalR Javaがサーバーに接続できません

  28. 28

    Cassandra cqlsh「サーバーに接続できません」

  29. 29

    Apacheサーバー上のMySQLに接続できません

ホットタグ

アーカイブ