Scala客户端服务器使用套接字多线程

时间:2014-06-09 19:51:02

标签: multithreading scala sockets client-server

我无法理解这个问题 我是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

}
}

1 个答案:

答案 0 :(得分:2)

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

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

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

但是我不建议直接使用普通的旧java方法。有很棒的图书馆可以为你处理。例如Akka:

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

我还会敦促你阅读关于期货的内容,因为它们对于做同步异步非常有用。