Last active
December 23, 2015 19:59
-
-
Save demoth/6686125 to your computer and use it in GitHub Desktop.
simple chat client
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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