Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- import java.util.ArrayList;
- import java.util.List;
- import lombok.AutoGenMethodStub;
- import lombok.Cleanup;
- import lombok.Data;
- @AutoGenMethodStub (throwException = true)
- public class MultiSocketLomboked extends Socket {
- @Data
- public static class Destination {
- private final String host;
- private final int port;
- }
- private final List<Socket> alls;
- private List<InputStream> allis;
- private List<OutputStream> allos;
- private int lastwrite;
- private final byte[] buf;
- private int buflen;
- private class MultiInputStream extends InputStream {
- @Override
- public int read() throws IOException {
- if (lastwrite < 0)
- throw new IllegalStateException("MultiSocket is only for request-response");
- while (alls.size() > 0) {
- try {
- final int b = allis.get(lastwrite).read();
- buflen = 0;
- return b;
- } catch (final Exception e) {
- remove(lastwrite);
- allos.get(0).write(buf, 0, buflen); // additional code is necessary final to handle if this call throws an exception
- lastwrite = 0;
- }
- }
- throw new IOException("No working sockets");
- }
- }
- private class MultiOutputStream extends OutputStream {
- @Override
- public void write(final int b) throws IOException {
- while (alls.size() > 0) {
- try {
- buf[buflen] = (byte) b;
- buflen++;
- allos.get(0).write(b);
- lastwrite = 0;
- return;
- } catch (final Exception e) {
- remove(0);
- allos.get(0).write(buf, 0, buflen); // additional code is necessary final to handle if this call throws an exception
- lastwrite = 0;
- }
- }
- throw new IOException("No working sockets");
- }
- }
- private void remove(final int ix) {
- try {
- @Cleanup final OutputStream os = allos.remove(ix);
- @Cleanup final InputStream is = allis.remove(ix);
- @Cleanup final Socket s = alls.remove(ix);
- } catch (final IOException ignored) {}
- }
- public MultiSocketLomboked(final List<Destination> dest) throws IOException {
- alls = new ArrayList<Socket>();
- for (final Destination d : dest) {
- alls.add(new Socket(d.getHost(), d.getPort()));
- }
- lastwrite = -1;
- buf = new byte[102400];
- buflen = 0;
- }
- @Override
- public InputStream getInputStream() throws IOException {
- allis = new ArrayList<InputStream>();
- for (final Socket s : alls) {
- allis.add(s.getInputStream());
- }
- return new MultiInputStream();
- }
- @Override
- public OutputStream getOutputStream() throws IOException {
- allos = new ArrayList<OutputStream>();
- for (final Socket s : alls) {
- allos.add(s.getOutputStream());
- }
- return new MultiOutputStream();
- }
- @Override
- public synchronized void close() throws IOException {
- while (alls.size() > 0) {
- remove(0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement