Groovy: un chat

Tok es un programa de chat escrito en Groovyen dos horas por el autor de SH*TMORES, un blog sobre ingeniería de software. El autor (no he logrado encontrar cómo se llama) se quedó sin ADSL unos días, y decidió dedicar su tiempo libre a “aprender un poco más de Groovy”. Cogió su ejemplar de Groovy in Action, y en un par de horas tenía una sencilla aplicación de chat cliente-servidor.
El cliente tiene 63 líneas de código, el servidor solo 33, y la conectividad entre ambos se realiza mediante XML-RPC.

Vía Groovy.or.ges, el post original aquí

Cada día estoy más convencido de que tengo que aprender Groovy. Ya. Ahora. Solo de pensar la de cientos de líneas que me puedo ahorrar programando lo mismo que hago en Java pero en Groovy se me hace la boca agua.

Tok client

 1 import groovy.swing.SwingBuilder
 2 import groovy.net.xmlrpc.XMLRPCServerProxy as Proxy
 3 import groovy.net.xmlrpc.XMLRPCServer as Server
 4 
 5 import java.net.ServerSocket
 6 import java.awt.BorderLayout as BL
 7 import javax.swing.WindowConstants as WC
 8 
 9 
10 def swing = new SwingBuilder()
11 def content = new StringBuffer()
12 def remote = new Proxy('http://localhost:8081/')
13 
14 newMsg = swing.action( name:'newMessage', closure: {
15     msg = remote.chat( swing.inputMsg.text )
16     //content << "
${msg}" 17 //swing.msgPane.text = content 18 swing.inputMsg.text = "" 19 } ) 20 21 def frame = swing.frame( title:'Tok' ) { 22 // Menu bar 23 menuBar { 24 menu('File') { 25 menuItem 'Quit' 26 } 27 menu('Edit') { 28 } 29 menu('Help') { 30 menuItem 'About' 31 } 32 } 33 34 // Panel 35 panel( layout: new BL() ) { 36 scrollPane( constraints: BL.CENTER ) { 37 editorPane( id:'msgPane', editable:false, preferredSize:[60, 100], 38 editorKit: new javax.swing.text.html.HTMLEditorKit() ) 39 } 40 panel(constraints: BL.SOUTH) { 41 textField(id:'inputMsg', columns:20) 42 button( action:newMsg, 'Go' ) 43 } 44 } 45 } 46 content << "Tok session started on ${new Date().toString()}" 47 swing.msgPane.text = content 48 49 // Perform client registration to the chat network 50 int ticket = remote.register() 51 println "TICKET: ${ticket}" 52 def server = new Server() 53 server.startServer( new ServerSocket(ticket) ) 54 55 server.update = { msg -> 56 print msg 57 content << "${msg}" 58 swing.msgPane.text = content 59 } 60 61 frame.pack() 62 frame.setDefaultCloseOperation( WC.EXIT_ON_CLOSE ) 63 frame.show()

Tok Server

 1 import groovy.net.xmlrpc.XMLRPCServer as Server
 2 import groovy.net.xmlrpc.XMLRPCServerProxy as Proxy
 3 import java.net.ServerSocket
 4 
 5 
 6 def ticket = 9991
 7 def clients = []
 8 
 9 def server = new Server()
10 
11 server.chat = { msg ->
12     println msg
13         clients.each { client ->
14             //client.update( msg )
15             updateClient(client, msg)
16     }
17 }
18 
19 def updateClient(client, msg) {
20     try {
21         client.update( msg )
22     } catch (Exception ex) {
23         println ex
24     }
25 }
26 
27 server.register = {
28     clients << new Proxy("http://localhost:${ticket}")
29    return ticket++
30 }
31 
32 def socket = new ServerSocket(8081)
33 server.startServer(socket)

2 thoughts on “Groovy: un chat

Comments are closed.