Skip to content

Instantly share code, notes, and snippets.

@demoth
Last active December 23, 2015 19:59
Show Gist options
  • Save demoth/6686125 to your computer and use it in GitHub Desktop.
Save demoth/6686125 to your computer and use it in GitHub Desktop.
simple chat client
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.BorderLayout as BL
swing = new SwingBuilder()
reader = null
writer = null
socket = null
listening = true
def sendAction = swing.action(name: 'Print', closure: {
def text = swing.inputField.text
if (text) {
switch (text) {
case { it.startsWith '/connect' }:
connect(text)
break
default:
writer.println text
writer.flush()
}
swing.inputField.text = ''
}
})
//widgets
def W = [
mainFrame : [id: 'mainFrame', title: 'Connecting...', size: [300, 450], defaultCloseOperation: JFrame.EXIT_ON_CLOSE, show: true, windowClosed: {exit()}],
scrollPane : [id: 'scrollPane', constraints: BL.CENTER, border: swing.emptyBorder(6)],
messagesArea: [id: 'messagesArea', editable: false, lineWrap: true],
inputField : [id: 'inputField', action: sendAction, constraints: BL.CENTER],
menuButton : [id: 'sendButton', text: 'Opts', constraints: BL.EAST],
south : [border: swing.emptyBorder(6), constraints: BL.SOUTH]
]
swing.frame(W.mainFrame) {
lookAndFeel('system')
borderLayout()
scrollPane(W.scrollPane) {
textArea(W.messagesArea)
}
panel(W.south) {
borderLayout()
textField(W.inputField)
button(W.menuButton)
}
}
swing.doOutside {
while (listening) {
if (reader != null) {
String input = reader.readLine()
if (input != null)
edt {
swing.messagesArea.append(input + '\n')
swing.scrollPane.verticalScrollBar.value = swing.scrollPane.verticalScrollBar.maximum
}
}
sleep 500
}
}
def connect(String command) {
try {
def tokens = command.replaceAll('/connect', '').tokenize(':')
def host = tokens[0].trim()
def port = tokens[1].toInteger()
socket = new Socket(host, port)
reader = new BufferedReader(new InputStreamReader(socket.inputStream))
writer = new PrintWriter(socket.outputStream)
swing.mainFrame.title = "Connected to $host:$port"
} catch (Exception e) {
swing.mainFrame.title = 'Cound not connect! ' + e.message
}
}
if (args.size() == 2)
connect("${args[0]}:${args[1]}")
def exit() {
listening = false
reader.close()
writer.close()
socket.close()
}
#!/usr/bin/env groovy
def port = args[0].toInteger()
ServerSocket server = new ServerSocket(port)
listening = true
text = new StringBuilder()
Map<String, PrintWriter> clients = new HashMap<>()
class SmallChatThread extends Thread {
Socket client
Map<String, PrintWriter> clients
PrintWriter writer
StringBuilder text
String name = ('user' + Math.random()).replaceAll('\\.', '')
void dispatch(String message) {
if (message.startsWith('/name')) {
def newName = message.replaceAll('\\s*/name\\s*', '')
if (!clients.containsKey(newName)) {
clients.put newName, clients.get(name)
clients.remove(name)
name = newName
} else {
}
}
}
void run() {
writer = new PrintWriter(client.outputStream)
clients.put name, writer
def reader = new BufferedReader(new InputStreamReader(client.inputStream))
while (!client.closed) {
def message
while ((message = reader.readLine()) != null) {
if (message.startsWith('/'))
dispatch(message)
else {
String line = name + ': ' + message
println line
text.append(line)
broadcast(clients.values(), line)
}
}
sleep 100
}
clients.remove name
}
static def broadcast(writers, String message) {
writers.each { it.println(message); it.flush() }
}
}
while (listening) {
new SmallChatThread(client: server.accept(), clients: clients, text: text).start()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment