handle server connections;
authorwenzelm
Sun, 06 Aug 2017 17:32:32 +0200
changeset 66350 66331026a2fc
parent 66349 66b843e4cff5
child 66351 95847ffa62dc
handle server connections;
src/Pure/Tools/server.scala
--- a/src/Pure/Tools/server.scala	Sun Aug 06 13:35:03 2017 +0200
+++ b/src/Pure/Tools/server.scala	Sun Aug 06 17:32:32 2017 +0200
@@ -8,7 +8,8 @@
 
 
 import java.util.UUID
-import java.net.{ServerSocket, InetAddress}
+import java.io.{BufferedReader, BufferedWriter, InputStreamReader, OutputStreamWriter}
+import java.net.{Socket, ServerSocket, InetAddress}
 
 
 object Server
@@ -127,9 +128,48 @@
 
 class Server private(_port: Int, _password: String)
 {
-  val socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1"))
-  def port: Int = socket.getLocalPort
+  private val server_socket = new ServerSocket(_port, 50, InetAddress.getByName("127.0.0.1"))
+  def port: Int = server_socket.getLocalPort
+  def close { server_socket.close }
+
   val password: String = proper_string(_password) getOrElse UUID.randomUUID().toString
 
-  lazy val thread: Thread = Thread.currentThread // FIXME
+  private def handle_connection(socket: Socket)
+  {
+    val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, UTF8.charset))
+    val writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream, UTF8.charset))
+
+    def println(s: String)
+    {
+      writer.write(s)
+      writer.newLine()
+      writer.flush()
+    }
+
+    reader.readLine() match {
+      case null =>
+      case bad if bad != password => println("BAD PASSWORD")
+      case _ =>
+        var finished = false
+        while (!finished) {
+          reader.readLine() match {
+            case null => println("FINISHED"); finished = true
+            case line => println("ECHO " + line)
+          }
+        }
+    }
+  }
+
+  lazy val thread: Thread =
+    Standard_Thread.fork("server") {
+      var finished = false
+      while (!finished) {
+        Exn.capture(server_socket.accept) match {
+          case Exn.Res(socket) =>
+            Standard_Thread.fork("server_connection")
+              { try { handle_connection(socket) } finally { socket.close } }
+          case Exn.Exn(_) => finished = true
+        }
+      }
+    }
 }