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 vetelnet
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()
}
}
}
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
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