2016-07-11 10 views
1

同じポートにバインドされた2つのtcp接続を作成しようとしています。 java.net.BindException: Address already in useというエラーが表示されます。これはどちらもポートとして18333を使用しているので意味がありますが、一意のホストを持つポートで2つの接続を行うには何らかの方法が必要です。私はguide in the akka tcp manualと一緒に従っています。どうすればこの作品を作れますか?プロトコルは18333に接続を作成する必要があると言いますが、一度に1つのピアしか持つことができない場合は、プロトコルのp2p部分が役に立たなくなります。ここで Akkaは同じポートで2つのTcp接続を作成します

はコードです:

val probe1 = TestProbe() 
val probe2 = TestProbe() 
val client1 = system.actorOf(Client.props(TestNet3, probe1.ref)) 
val client2 = system.actorOf(Client.props(TestNet3, probe2.ref)) 

val local = new InetSocketAddress(18333) 

val remote1 = new InetSocketAddress("testnet-seed.bitcoin.petertodd.org", 18333) 

client1 ! Tcp.Connect(remote1,Some(local)) 
probe1.expectMsgType[Tcp.Connected] 

val remote2 = new InetSocketAddress("testnet-seed.bluematt.me", 18333) 
client2 ! Tcp.Connect(remote2,Some(local)) 
probe2.expectMsgType[Tcp.Connected] 


client1 ! Tcp.Abort 
client2 ! Tcp.Abort 
+1

あなたはあなたのソケットのアッカセットSO_REUSEADDRを作る方法を探す必要があります。これはTcp.Connectで発生する必要があります。ソケットオプションとしてSO.ReuseAddr(true)のようなものを渡す必要があるでしょう。 – midor

+0

あなたの答えは正解です。あなたが正式な投稿を書いたければ、私はあなたに答えを与えるでしょう。 –

+0

私は答えを書いていましたが、それがまさにSO.ReuseAddr(真実)だったかどうか教えてください。私の頭の後ろにそれがあったからですが、私はdocリンクを見つけることができませんでした。 – midor

答えて

1

ソケットのakkaにSO_REUSEADDRを設定する方法を調べる必要があります。これはTcp.Connectで発生する必要があります。ソケットオプションとしてSO.ReuseAddr(true)のようなものを渡す必要があるでしょう。回答に基づいて自分の問題を解決するために

OPのコード:

val options = List(Inet.SO.ReuseAddress(true)) 
client1 ! Tcp.Connect(remote1, Some(local1), options) 

Inet.SO documentation

0

あなたは、それは、「接続は18333に作成する必要がある」と言うあなたが実行しようとしている環境のために十分なコンテキストを提供していない彼らが話しています接続先や目的地についてそれは目的地であることがより理にかなっています。あなたのコードは送信元アドレスを指定します。送信元アドレスが何であるか気にする必要はありません。あなたは宛先アドレスだけを気にします。

+0

これは、送信元と送信先の両方を意味します。私が扱っているプロトコルは、非標準ポートで接続しているピアにペナルティを課します –

関連する問題