Java.net.SocketException: программное обеспечение вызвало прерывание соединения: ошибка записи сокета

Я пытаюсь отправить изображение из приложения Java в приложение J2ME. Проблема в том, что я получаю это исключение:

java.net.SocketException: Software caused connection abort: socket write error

Я просмотрел сеть, и хотя эта проблема не так редка, я не смог найти конкретного решения. Перед передачей я преобразую изображение в массив байтов. Это методы, найденные в настольном приложении и на J2ME, соответственно

    public void send(String ID, byte[] serverMessage) throws Exception
    {            
        //Get the IP and Port of the person to which the message is to be sent.
        String[] connectionDetails = this.userDetails.get(ID).split(",");
        Socket sock = new Socket(InetAddress.getByName(connectionDetails[0]), Integer.parseInt(connectionDetails[1]));
        OutputStream os = sock.getOutputStream();
        for (int i = 0; i < serverMessage.length; i++)
        {
            os.write((int) serverMessage[i]);
        }
        os.flush();
        os.close();
        sock.close();
    }

    private void read(final StreamConnection slaveSock)
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                try
                {
                    DataInputStream dataInputStream = slaveSock.openDataInputStream();
                    int inputChar;
                    StringBuffer results = new StringBuffer();
                    while ( (inputChar = dataInputStream.read()) != -1)
                    {
                        results.append((char) inputChar);
                    }
                    dataInputStream.close();
                    slaveSock.close();
                    parseMessage(results.toString());
                    results = null;
                }

                catch(Exception e)
                {
                    e.printStackTrace();
                    Alert alertMsg = new Alert("Error", "An error has occured while reading a message from the server:\n" + e.getMessage(), null, AlertType.ERROR);
                    alertMsg.setTimeout(Alert.FOREVER);
                    myDisplay.setCurrent(alertMsg, resultScreen);
                }
            }
        };
        new Thread(runnable).start();
    }   

Я отправляю сообщение по локальной сети, и у меня нет проблем при отправке коротких текстовых сообщений вместо изображений. Кроме того, я использовал wirehark, и кажется, что настольное приложение только отправляет часть сообщения. Любая помощь будет высоко оценен. Кроме того, все работает на симуляторе J2ME.

Ответы

Ответ 1

Обратитесь к ответам на Официальные причины для "Программного обеспечения прерывания соединения: ошибка записи сокета"

ИЗМЕНИТЬ

Я не думаю, что в целом есть много чего, и в вашем коде не может быть ничего необычного, что приведет к сбою соединений. Однако я хотел бы отметить, что:

  • Отбрасывание байтов в целые числа для вызова write не требуется. Это будет продвигаться автоматически.
  • Лучше (проще, потенциально более эффективно с точки зрения сетевого трафика) использовать write(byte[]) вместо write(int).
  • Принимающая сторона предполагает, что каждый байт представляет собой полный символ. Это может быть неправильным в зависимости от того, как отправляющая сторона формирует передаваемые байты, и
  • Было бы неплохо начать с отправки количества байтов, чтобы получающая сторона могла сказать, что что-то пошло не так, прежде чем отправитель отправил весь массив байтов.