2016-03-21 14 views
0

Akka Stream'den biriyim. TCP ve basit bir dosya alıcısı aracılığıyla basit bir dosya sunucusu yaptım. Hem sunucu hem de alıcı aynı ana bilgisayarda olduğunda, her ikisi de iyi çalışır. Ancak alıcı, sunucu sunucunun ana bilgisayarından farklı bir ana bilgisayardayken sunucuya erişemez. Yani sorumu, sunucudan farklı ana bilgisayardaki alıcının, sunucuya erişememesidir. Ben 192.168.1.20 de sunucu çalıştırırsanızAkka Stream'de localhost'tan gelen TCP talebini reddetme

Örneğin, 192.168.1.20 alıcı sunucusuna erişebilir, ancak 192.168.11.22 alıcı sunucuya erişemez.

I portu açık olduğunu doğruladı. Aynı bağlantı noktasını kullanan basit bir sistem yaptım ve telnet komutunu kullanarak bağlantı noktasına erişebildim.

kaynak kodu

Server.scala (dosya sunucusu)

import java.io.File 

import akka.actor.ActorSystem 
import akka.stream.ActorMaterializer 
import akka.stream.scaladsl.{FileIO, Flow, Keep, Sink, Tcp} 

import scala.io.StdIn 

/** 
    * Created by Jimmy on 2016/03/21. 
    */ 
object Server { 
    def main(args: Array[String]) { 

    implicit val system = ActorSystem("system") 
    implicit val materializer = ActorMaterializer() 
    import system.dispatcher 

    // choose which file is uploaded 
    val filePath: String = if(args.length == 1){ 
     args(0) 
    } else { 
     StdIn.readLine("File Path: ") 
    } 

    val sourceFile = new File(filePath) 
    println(sourceFile.exists()) 


    Tcp().bind("127.0.0.1", 9999) runForeach {connection => 
     println(s"client address: ${connection.remoteAddress}") 

     val sendFileFlow = Flow.fromSinkAndSourceMat(Sink.ignore, FileIO.fromFile(sourceFile))(Keep.right) 

     connection.handleWith(sendFileFlow).onComplete{r => 
     println(s"result: $r") 
     } 
    } 
    println("server running...") 
    } 
} 

Client.scala (dosya alıcı) sunucu kodunda

import java.io.File 

import akka.actor.ActorSystem 
import akka.stream.ActorMaterializer 
import akka.stream.scaladsl.{FileIO, Flow, Keep, Source, Tcp} 
import akka.util.ByteString 

import scala.io.StdIn 

/** 
    * Created by Jimmy on 2016/03/21. 
    */ 
object Client { 
    def main(args: Array[String]) { 

    implicit val system = ActorSystem("system") 
    implicit val materializer = ActorMaterializer() 
    import system.dispatcher 

    // choose a host 
    val host: String = if(args.length == 1){ 
     args(0) 
    } else { 
     StdIn.readLine("Host: ") 
    } 

    val port = 9999 
    val storageFile = new File("storage-file") 

    import java.nio.file.StandardOpenOption._ 
    val saveFileFlow = Flow.fromSinkAndSourceMat(FileIO.toFile(storageFile, options=Set(CREATE, WRITE)), Source.repeat(ByteString.empty))(Keep.left) 

    Tcp().outgoingConnection(host, port).joinMat(saveFileFlow)(Keep.right).run().onComplete{r => 
     println(s"result: $r") 
     system.terminate() 
    } 
    } 
} 
+1

Sadece bir tahmin olarak, üzerinde sunucu bağlamak denemek isteyebilirsiniz '0.0.0.0' yerine' 127.0.0.1' (sunucunun 'Tcp.bind()' çağrısında). '127.0.0.1' ile sunucunuzun sadece geri döngü ağı arayüzünde dinlediğini düşünüyorum, bu yüzden ağdaki diğer makinelerde mevcut değil. (Üzgünüz, bu ATM'yi doğrulamak için hiçbir yolum yok, bu yüzden cevap olarak göndermeyin.) – sainaen

+0

Cevabınız için çok teşekkür ederim! 127.0.0.1'i 0.0.0.0 ile değiştirdiğimde, alıcı alıcıya erişebilirdi. Geridönüşü anlamıyorum, bunu öğreneceğim. Teşekkür ederim. – redstone

cevap

5

, sen bağlayıcı için burada 127.0.0.1 geridöngü adresi. Bu adres yerel bir adrestir ve bu nedenle bu makinenin dışından bağlanamaz. Sunucu kodunuzda uzaktan bağlanabilmek istiyorsanız, Tcp().bind numaralı çağrıya, sunucuyu çalıştıran makinenin gerçek ipine, geridönüşe gerek olmayacaktır. Ayrıca, @sainaen tarafından önerildiği gibi, bağlanabilecek açık bir ip seçmek yerine tüm kullanılabilir ağ arabirimlerine bağlanmak için sunucu kodunda 0.0.0.0 bağlayabilirsiniz.