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 } |