【问题标题】:Scala client server multithreaded using socketScala客户端服务器多线程使用套接字
【发布时间】:2014-06-09 19:51:01
【问题描述】:

我无法理解这里的这个 我是几周前的 Scala 初学者,尝试过但失败了 我已经阅读并尝试过有关 Actors、Futures 等的内容并没有为我工作

您能否提供一个服务器客户端示例(或至少是服务器端)的代码 假设使用从多个客户端接收字符串(即文件路径)并在线程中处理每个客户端的套接字打开连接

import java.net.{Socket, ServerSocket}
import java.util.concurrent.{Executors, ExecutorService}
import java.util.Date
import java.io._
import scala.io._
import java.nio._
import java.util._
import scala.util.control.Breaks
import java.security.MessageDigest
import java.security.DigestInputStream
import scala.util.Sorting

class NetworkService(port: Int, poolSize: Int) extends Runnable {
  val serverSocket = new ServerSocket(port)
  val pool: ExecutorService = Executors.newFixedThreadPool(poolSize)

  def run() {
    try {
      var i = 0
      while (true) {
        // This will block until a connection comes in.
        val socket = serverSocket.accept()
        val in = new BufferedReader(new InputStreamReader(socket.getInputStream)).readLine
        /*var f = new FileSplit(in) //FileSplit is another class that i would like each                   
                                    // client's sent string to be passed as an instance of 
          f.move*/
        pool.execute(new Handler(socket))

      }
    } finally {
      pool.shutdown()


    }
  }

}

class Handler(socket: Socket) extends Runnable {
  def message = (Thread.currentThread.getName() + "\n").getBytes

  def run() {
    socket.getOutputStream.write(message)
    socket.getOutputStream.close()

  }
}


object MyServer {
  def main(args: Array[String]) {
(new NetworkService(2030, 2)).run

}
}

【问题讨论】:

  • 请给我发代码?你尝试过什么,你在哪里失败了?我们可以提供帮助。
  • 已添加试用码您可以看看
  • “它对我不起作用”是不够的。你被困在哪里了?哪些部分工作/不工作?有什么症状?你试过什么?
  • 我特别卡在从每个客户端接收线程字符串并在自己的线程(或参与者)上处理它
  • [val in = new BufferedReader(new InputStreamReader(socket.getInputStream)).readLine] 不能在while循环外处理,因为它的值会根据客户端而变化

标签: multithreading scala sockets client-server


【解决方案1】:

您有多种选择。你可以做同样的旧 java 风格的应用程序,基本上只使用 java 标准库和 scala 语法。

也许这有帮助:Scala equivalent of python echo server/client example?

您只需要在新线程中编写处理每个套接字(从 accept() 获得的)的逻辑。

但是,我不建议直接使用普通的旧 java 方法。那里有很棒的图书馆可以为您处理这些问题。例如阿卡:

http://doc.akka.io/docs/akka/2.3.3/scala/io-tcp.html

我还建议您阅读有关 futures 的内容,因为它们对于异步处理非常有用。

【讨论】:

猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2021-07-19
  • 2017-02-25
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多