2016-06-15 6 views
0

はじめ

私はJRakNetの生みの親、Java用の最新プロトコルRakNetの基本を実装ネットワーキング・ライブラリーです。私はこのライブラリを作って、RakNetを使うMinecraft:Pocket Edition用のマルチプレイヤーサーバーを作ることができました。Netty 5 UDPでどのアドレスが例外を発生させるかを調べる方法はありますか?

問題

は、しかし、私は、サーバーとクライアントで抱えてきた一つの問題は、ハンドラの例外処理です。無効なパケットが送信されるたびに、データが正しく読み込まれず、例外が正常にスローされます。しかし、例外を引き起こした外部アドレスを把握する方法を見つける必要があります。

私は問題

通常を修正することはできませんなぜ、ServerBootstrapを使用してTCPサーバー上で、私は上司と労働者のグループをグループにできる午前例外がキャッチされたときに、私はそれが原因でどこから来ることを知っていますクライアントにはそれ専用のハンドラがあります。しかし、RakNetはUDPであり、コネクションレスでパケットがどこから来ても良いので、ハンドラは1つしかありません。例外がスローされるたびに必ず誰がそれを引き起こしたのかわかりません。私は無視された例外リストを持つことを試みたが、は極端にが非効率であると考える。コード内にlastSenderと呼ばれる変数があることを試しましたので、例外がスローされるたびに、エラーの原因となった人が表示されます。誰が例外を引き起こしたのかを理解するには良い方法ですか?または、UDP Nettyサーバーで誰がエラーを起こしたかを把握するための別の方法がありますか?

The RakNetClient class at the time of posting

The RakNetClientHandler classa at the time of posting

Here is the whole project code at the time of posting if needed

TL投稿時のソースファイル、私はどのアドレスを把握するための良い方法を見つける必要があるDR

未処理のBootstrap Netty UDPサーバー/クライアントで例外が発生しました。私はUDPでServerBootstrapを使用しようとしましたが、それはまだ述べたように1つのチャネルしか使用していないようです。here

+0

FYI:Netty 5が死んでいます。 4.1が新しいヘッドです。 – Nicholas

答えて

1

Nettyは素晴らしいスレッドモデルsince 4.0を持っています。

特に

ChannelHandlerが開発者からは、わずかchange in 5.0しかし

があった@Sharable

でアノテートされていない限りネッティーが、同時にChannelHandlerのメソッドを呼び出すことはありません視点は、変更する唯一のことはもはやChannelHandlerが常に実行されることが保証されていないことです同じスレッドによってd。ただし、同時に2つ以上のスレッドによって実行されることはありません。さらに、Nettyは発生する可能性のあるメモリの可視性の問題も処理します。したがって、ChannelHandler内のスレッドセーフティと揮発性変数について心配する必要はありません。あなたがあなたの利点にこれを使用してexceptionCaught方法を直接messageReceived

public static void invokeChannelReadNow(final ChannelHandlerContext ctx, final Object msg) { 
    try { 
     ((AbstractChannelHandlerContext) ctx).invokedThisChannelRead = true; 
     ctx.handler().channelRead(ctx, msg); // -> calls messageReceived 
    } catch (Throwable t) { 
     notifyHandlerException(ctx, t);  // -> calls exceptionCaught 
    } 
} 

よう

(source)

後に呼び出されるボンネットの下に

static class UdpHandler extends SimpleChannelInboundHandler<DatagramPacket> { 
    private InetSocketAddress lastSender; 

    @Override 
    protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception { 
     lastSender = packet.sender(); 
     throw new RuntimeException(); 
    } 

    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 
     System.out.println("Evil sender was: " + lastSender); 
    } 
} 

以上のものとの問題を解決することができます

ローカル変数の値は、 messageReceivedにあなたが設定したものはまだ含まれています。

関連する問題