/* * Copyright 2016 Nathan Howard * * This file is part of OpenGrave * * OpenGrave is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenGrave is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenGrave. If not, see <http://www.gnu.org/licenses/>. */ package com.opengrave.common; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; import java.util.ArrayList; import java.util.List; public class SocketSender implements Runnable { private Object lock = new Object(); Thread thread; private List<ByteArrayOutputStream> list; private boolean running = true; OutputStream output; Connector conn; public void stop() { running = false; thread.interrupt(); try { output.close(); } catch (IOException e) { e.printStackTrace(); } } public SocketSender(Connector conn, OutputStream output) { this.conn = conn; list = new ArrayList<ByteArrayOutputStream>(); // list = Collections.synchronizedList(new // Vector<ByteArrayOutputStream>()); this.output = output; thread = new Thread(this, "Socket Sender Thread"); thread.start(); } @Override public void run() { try { while (running) { // Thread.sleep(100); synchronized (lock) { lock.wait(); } synchronized (list) { for (ByteArrayOutputStream baos : list) { try { output.write(baos.toByteArray()); output.flush(); baos.close(); } catch (SocketException e) { new DebugExceptionHandler(e); conn.setDestroy(); } catch (IOException e) { new DebugExceptionHandler(e); conn.setDestroy(); } } list.clear(); } } output.close(); } catch (InterruptedException e) { } catch (IOException e) { new DebugExceptionHandler(e); } } public void addSend(ByteArrayOutputStream out) { synchronized (list) { list.add(out); } synchronized (lock) { lock.notifyAll(); } } public void setName(String string) { thread.setName(string + " : Writer"); } }