package com.joelpm.bidiMessages.client; import java.util.ArrayList; import java.util.List; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import com.joelpm.bidiMessages.generated.Message; import com.joelpm.bidiMessages.generated.MessageService; /** * Client that connects to the server and handles the sending and receiving * of message objects. Will also attempt to reconnect if the server disappears. * * @author Joel Meyer */ public class Client implements MessageService.Iface { private final ConnectionStatusMonitor connectionMonitor; private final MessageSender sender; private final MessageReceiver receiver; private final String name; private final TTransport transport; private final TProtocol protocol; private final List<MessageListener> listeners; public Client(String name, String server, int port, MessageService.Iface messageHandler) { this.name = name; this.transport = new TSocket(server, port); this.protocol = new TBinaryProtocol(transport); this.connectionMonitor = new ConnectionStatusMonitor(transport); this.sender = new MessageSender(protocol, connectionMonitor); this.receiver = new MessageReceiver(protocol, messageHandler, connectionMonitor); new Thread(sender).start(); new Thread(receiver).start(); this.connectionMonitor.tryOpen(); this.listeners = new ArrayList<MessageListener>(); } public void addListener(MessageListener listener) { listeners.add(listener); } public void sendMessageToServer(String msg) { sender.send(new Message(name, msg)); } @Override public void sendMessage(Message msg) throws TException { for (MessageListener listener : listeners) { listener.messageReceived(msg); } } /** * @param args */ public static void main(String[] args) throws Exception { MessageService.Iface handler = new MessageService.Iface() { @Override public void sendMessage(Message msg) throws TException { System.out.println("Got msg: " + msg); } }; Client client = new Client(args[0], args[1], Integer.parseInt(args[2]), handler); client.sendMessageToServer("Hello there!"); for (int i = 0; i < 100; i++) { client.sendMessageToServer(String.format("Message %s", i)); Thread.sleep(1000); } } }