当通过Scala中的插座发送时,JAR文件会损坏



我知道Scala使用Java插座,但是我不太了解人们在同一问题上遇到的问题的答案,但严格在Java中。

这是我的代码:

我正在尝试通过套接字发送JAR文件,但是当我尝试从另一侧打开JAR文件时,该文件似乎已损坏。我该如何解决?

服务器:

object server extends App {
  import java.net._
  import java.io._
  import scala.io._
  import scala.io.Source
  val server = new ServerSocket(9999)
  //Master should ping the slave actor to request for jar file
  while (true) {
      val s = server.accept()
      val in = new BufferedSource(s.getInputStream()).getLines()
      val out = new PrintStream(s.getOutputStream())
      val filename = "mapReduce.jar"
      for (line <- Source.fromFile(filename, "ISO-8859-1").getLines)       {
          out.println(line)
          // println(line)
      }

      out.flush()
      s.close()
  }
}

与客户一起:

object client extends App {
  import java.net._
  import java.io._
  import scala.io._
  import java.util.jar._
  val s = new Socket(InetAddress.getByName("localhost"), 9999)
  lazy val in = new BufferedSource(s.getInputStream()).getLines()
  val out = new PrintStream(s.getOutputStream())
  out.println("Give me the jar file!")
  out.flush()
  val file = new File("testmapReduce.jar")
  val bw = new BufferedWriter(new FileWriter(file))
  while(in.hasNext) {
      val buf = in.next()
      bw.write(buf)
      // println(buf)
  }

  s.close()
  bw.close()

  println("Done!")
  val jar = new JarFile(file) //this part fails
}

SourcePrintStream等,旨在处理文本,而不是二进制数据。他们按照他们使用的字符集(在您的情况下在" ISO-8859-1")上转换读写数据。请勿使用它们读/写二进制数据。

如果您只需要发送字节,请不要打扰解释它们:

  val f = new FileInputStream(filename)
  val bos = new BufferedOutputStream(out)
  Stream.continually(f.read).takeWhile(_ != -1).foreach(bos.write)
  f.close
  bos.close

最新更新