Servidor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader import java.io.PrintWriter import java.net.ServerSocket import java.net.Socket import java.util.concurrent.CopyOnWriteArrayList fun main() { val serverSocket = ServerSocket(12345) println("Servidor en espera de conexiones...") val clients = CopyOnWriteArrayList<PrintWriter>() while (true) { val clientSocket = serverSocket.accept() val clientOutput = PrintWriter(clientSocket.getOutputStream(), true) clients.add(clientOutput) Thread { val input = BufferedReader(InputStreamReader(clientSocket.getInputStream())) val clientName = input.readLine() ?: "Usuario Anónimo" broadcast("$clientName se ha unido al chat.", clients) while (true) { val message = input.readLine() ?: break broadcast("$clientName: $message", clients) } clients.remove(clientOutput) clientSocket.close() broadcast("$clientName se ha desconectado.", clients) }.start() } } fun broadcast(message: String, clients: List<PrintWriter>) { for (client in clients) { client.println(message) } } |
Cliente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import javafx.application.Application import javafx.application.Application.launch import javafx.application.Platform import javafx.scene.Scene import javafx.scene.control.TextArea import javafx.scene.control.TextField import javafx.scene.layout.VBox import javafx.stage.Stage import java.io.IOException import java.io.PrintWriter import java.net.Socket class ChatClient : Application() { private lateinit var serverOut: PrintWriter override fun start(primaryStage: Stage) { primaryStage.title = "Chat Cliente" val chatArea = TextArea() chatArea.isEditable = false val messageInput = TextField() messageInput.promptText = "Escribe un mensaje..." try { val socket = Socket("localhost", 12345) serverOut = PrintWriter(socket.getOutputStream(), true) val messageReceiver = Thread { try { val serverIn = socket.getInputStream().bufferedReader() var message: String? while (true) { message = serverIn.readLine() if (message != null) { Platform.runLater { chatArea.appendText("$message\n") } } } } catch (e: IOException) { e.printStackTrace() } } messageReceiver.isDaemon = true messageReceiver.start() } catch (e: IOException) { e.printStackTrace() } messageInput.setOnAction { val message = messageInput.text if (message.isNotEmpty()) { serverOut.println(message) messageInput.clear() } } val vbox = VBox(10.0) vbox.children.addAll(chatArea, messageInput) val scene = Scene(vbox, 400.0, 400.0) primaryStage.scene = scene primaryStage.show() } } fun main() { launch(ChatClient::class.java) } |
