Многократная запись и чтение через сокет - PullRequest
0 голосов
/ 10 января 2019

Мне нужно приложение для подключения платы по Wifi. Есть четыре фрагмента, которые, щелкая по каждому, должны написать массив байтов или один байт, а затем прочитать arrayByte. Сначала я просто читаю arrayBte без записи, и он отлично работает, но, щелкая другие фрагменты, я всегда получаю нулевое значение. Это мой код:

public class CommsThread extends Thread {
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;

public CommsThread() {
    try {
        socket = new Socket(Const.ip, Const.port);
    } catch (IOException e) {
        e.printStackTrace();
    }
    InputStream tmpIn = null;
    OutputStream tmpOut = null;
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();

    } catch (IOException e) {
        Log.d("SocketChat", e.getLocalizedMessage());
    }
    inputStream = tmpIn;
    outputStream = tmpOut;
}

public void run() {
    while (true) {
        try {
            byte[] data = new byte[1];
            inputStream.read(data);
            readData.add(data[0]);
        } catch (IOException e) {
        }
    }
}

 public void write(ArrayList<Byte> bytes) {
        ArrayList list = new ArrayList();
        list.add((byte)0xFE);
    for (byte b: bytes)
    {
        if(b >= 0xFD)
        {
            list.add((byte)0xFD);
            list.add((byte)(b - 0xFD));
        }
        else
            list.add(b);
    }
    list.add((byte)0xFF);
    byte[] listBytes = new byte[list.size()];
    for (int i = 0; i < list.size(); i++) {
        listBytes[i] = (byte)list.get(i);
    }
    try {
        outputStream.write(listBytes);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

Я использовал этот код в классе asynckTask:

Const.commsThread = new CommsThread();
                Const.commsThread.start();

щелкая фрагмент, я вызываю функцию записи:

//for example
     sendToServer("5");

 public static class WriteToServerTask extends AsyncTask<byte[], Void, Void> {
    protected Void doInBackground(byte[]... data) {
        ArrayList list = new ArrayList();
        list.add((byte)0x05);

        Const.commsThread.write(list);
        return null;
    }
}

public static void sendToServer(String message) {
    byte[] theByteArray = message.getBytes();
    new WriteToServerTask().execute(theByteArray);
}

Я не получаю сообщение об ошибке, но оно никогда не завершает выполнение функции записи. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я получил ответ:

Сначала:

new CreateCommThreadTask().execute();

CreateCommThreadTask:

   private class CreateCommThreadTask extends AsyncTask<Void, Integer, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                // ---create a socket---
                //  Const.socket = new Socket(Const.ip, Const.port);
                Socket socket = new Socket("192.168.4.1", 8888);
                Const.commsThread = new CommsThread(socket);
                Const.commsThread.start();

            } catch (UnknownHostException e) {
                Log.d("Sockets", e.getLocalizedMessage());
            } catch (IOException e) {
                Log.d("Sockets", e.getLocalizedMessage());
            }
            return null;
        }
    }

CommsThread:

public class CommsThread extends Thread {
    private Socket socket;
    private InputStream inputStream;
    private OutputStream outputStream;
    public static ArrayList<Byte> readData = new ArrayList<Byte>();

    public CommsThread(Socket sock) {
        socket = sock;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();

        } catch (IOException e) {
            Log.d("SocketChat", e.getLocalizedMessage());
        }
        inputStream = tmpIn;
        outputStream = tmpOut;
    }

    public void run() {
        while (true) {
            try {
                byte[] data = new byte[1];
                inputStream.read(data);
                readData.add(data[0]);

            } catch (IOException e) {

            }
        }

    }

    // send data to the remote device---
    public void write(ArrayList<Byte> bytes) {
        ArrayList list = new ArrayList();
        list.add((byte) 0xFE);
        for (byte b : bytes) {
            if (b >= 0xFD) {
                list.add((byte) 0xFD);
                list.add((byte) (b - 0xFD));
            } else
                list.add(b);
        }
        list.add((byte) 0xFF);
        byte[] listBytes = new byte[list.size()];
        for (int i = 0; i < list.size(); i++) {
            listBytes[i] = (byte) list.get(i);
        }
        try {
            outputStream.write(listBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    // ---call this from the main activity to
    // shutdown the connection---
    public void cancel() {
        try {
            socket.close();
        } catch (IOException e) {
        }
    }
}

написать:

new WriteToServerTask().execute(theByteArray);

WriteToServerTask:

public static class WriteToServerTask extends AsyncTask<byte[], Void, Void> {
        protected Void doInBackground(byte[]... data) {
            ArrayList list = new ArrayList();
            list.add((byte) 0x05);
            Const.commsThread.write(list);
            return null;
        }
    }

Работает отлично.

0 голосов
/ 10 января 2019

response2 наиболее вероятно null, потому что inputStream.read(Const.data2) возвращает -1. Это будет иметь место, если, например, сокет был закрыт одноранговым узлом ( docs ).

Вы должны добавить дополнительную обработку для случая -1. Также подумайте о добавлении регистрации, чтобы помочь вам понять, что происходит в программе.

run() будет выполняться асинхронно вскоре после того, как вы позвоните Const.commThread.start().

...