Реализуйте PeerManager, который содержит список пиров с их сокетами и слушателем - PullRequest
0 голосов
/ 31 октября 2019

У меня есть соединение с сервером, и оно отправляет мне список пиров, ожидающих соединения.

Моя идея - создать класс с именем PeerManager, который будет иметь дело с этими пирами.

Я не знаю, правильно ли я устанавливаю прослушиватель для каждого из них, если они отправляют мне сообщение.

На данный момент я создал класс PeerManager с экземпляром ArrayList, цель которого состоит в том, чтобы содержатьвсе эти одноранговые узлы.

У меня также есть объект Runnable, который создает сокет на указанном нами узле.

Но я не знаю, куда поместить моего слушателя для отделения сообщения от разных узлов.

public class PeerManager {
    private ArrayList<Peer> peers;
    private boolean mRun = false;
    private OutputStream mOutputStream;
    private InputStream mInputStream;

    public interface OnPeerMessageReceived {
        void peerMessageReceived(PeerMessage peerMessage);
    }

    public PeerManager() {
        this.peers = new ArrayList<Peer>();
    }

    public Peer connectToPeer(String username, String connectionType, String host, int port, String token, OnPeerMessageReceived listener) {
        Runnable mRunnable = new PeerSocketRunnable(host, port);

        OnPeerMessageReceived mPeerMessageListener = listener;

        Thread mThread = new Thread(mRunnable);
        mThread.start();
        try {
            mThread.join(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Peer peer = new Peer(username, connectionType, host, port, token);
        return peer;
    }

    class PeerSocketRunnable implements Runnable {
        private String mHost;
        private int mPort;

        PeerSocketRunnable(String host, int port) {
            this.mHost = host;
            this.mPort = port;
        }

        @Override
        public void run() {
            Socket socket = new Socket();
            mRun = true;
            try {
                Log.d("PEERSOCKET", "C: Connecting...");
                socket.connect(new InetSocketAddress(mHost, mPort), 2000);

                try {
                    mOutputStream = socket.getOutputStream();
                    mInputStream = socket.getInputStream();
                    byte[] buffer = new byte[0];
                    byte[] data;
                    int sizeData;
                    while (mRun) {
                        int count;
                        data = new byte[65536];
                        //Log.d("ServerManager", "BufferSize: " + buffer.length);
                        if ((count = mInputStream.read(data, 0, data.length)) >= 0) {
                            if (buffer.length > 0)
                                buffer = concatBytesArrays(buffer, Arrays.copyOfRange(data, 0, count));
                            else
                                buffer = Arrays.copyOfRange(data, 0, count);

                            if (buffer.length > 4) {
                                sizeData = readIntLe(buffer, 0) + 4;
                                if (buffer.length >= sizeData) {
                                    Log.d("PEERMANAGER", "PeerMessage: " + Arrays.toString(buffer));
                                    //TODO call the interface to send to Activity 
                                    //mPeerMessageListener.peerMessageReceived(message);
                                    buffer = Arrays.copyOfRange(buffer, sizeData, buffer.length);
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    Log.e("TCP", "S: Error", e);
                } finally {
                    socket.close();
                }

            } catch (Exception e) {
                Log.e("TCP", "C: Error", e);
            }
        }
    }
}

Спасибо всем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...