src/Pure/Tools/server.scala
changeset 66350 66331026a2fc
parent 66349 66b843e4cff5
child 66351 95847ffa62dc
equal deleted inserted replaced
66349:66b843e4cff5 66350:66331026a2fc
     6 
     6 
     7 package isabelle
     7 package isabelle
     8 
     8 
     9 
     9 
    10 import java.util.UUID
    10 import java.util.UUID
    11 import java.net.{ServerSocket, InetAddress}
    11 import java.io.{BufferedReader, BufferedWriter, InputStreamReader, OutputStreamWriter}
       
    12 import java.net.{Socket, ServerSocket, InetAddress}
    12 
    13 
    13 
    14 
    14 object Server
    15 object Server
    15 {
    16 {
    16   /* per-user servers */
    17   /* per-user servers */
   125     })
   126     })
   126 }
   127 }
   127 
   128 
   128 class Server private(_port: Int, _password: String)
   129 class Server private(_port: Int, _password: String)
   129 {
   130 {
   130   val socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1"))
   131   private val server_socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1"))
   131   def port: Int = socket.getLocalPort
   132   def port: Int = server_socket.getLocalPort
       
   133   def close { server_socket.close }
       
   134 
   132   val password: String = proper_string(_password) getOrElse UUID.randomUUID().toString
   135   val password: String = proper_string(_password) getOrElse UUID.randomUUID().toString
   133 
   136 
   134   lazy val thread: Thread = Thread.currentThread // FIXME
   137   private def handle_connection(socket: Socket)
       
   138   {
       
   139     val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, UTF8.charset))
       
   140     val writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream, UTF8.charset))
       
   141 
       
   142     def println(s: String)
       
   143     {
       
   144       writer.write(s)
       
   145       writer.newLine()
       
   146       writer.flush()
       
   147     }
       
   148 
       
   149     reader.readLine() match {
       
   150       case null =>
       
   151       case bad if bad != password => println("BAD PASSWORD")
       
   152       case _ =>
       
   153         var finished = false
       
   154         while (!finished) {
       
   155           reader.readLine() match {
       
   156             case null => println("FINISHED"); finished = true
       
   157             case line => println("ECHO " + line)
       
   158           }
       
   159         }
       
   160     }
       
   161   }
       
   162 
       
   163   lazy val thread: Thread =
       
   164     Standard_Thread.fork("server") {
       
   165       var finished = false
       
   166       while (!finished) {
       
   167         Exn.capture(server_socket.accept) match {
       
   168           case Exn.Res(socket) =>
       
   169             Standard_Thread.fork("server_connection")
       
   170               { try { handle_connection(socket) } finally { socket.close } }
       
   171           case Exn.Exn(_) => finished = true
       
   172         }
       
   173       }
       
   174     }
   135 }
   175 }