Сокеты Java - Отправка пользовательских объектов - PullRequest
1 голос
/ 12 января 2012

Я создал рабочие сокеты, и когда я пытаюсь отправить текст или числа, это нормально, но когда я пытаюсь отправить свой собственный объект класса, я получаю NullPointerException ... Вот некоторый код:

public boolean SendLi(List<Entity> list)
{
    try {
         out.writeObject(list);
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Send: Error on OutputStream.write(byte[])");
    }
    return true;
}

public List<Entity> RecvLi()
{
    List<Entity> data;
    data = new ArrayList<Entity>();
      try{
          data = (List<Entity>) in.readObject();
        } catch (IOException e) {
          System.err.println("Send: Error on OutputStream.read(byte[]) - IOException");
          return null;
        } catch (ClassNotFoundException e) {
          System.err.println("Send: Error on OutputStream.read(byte[]) - ClassNotFound");
            e.printStackTrace();
        }
    return data;
}

На самом деле, этот код, который я сделал для списков, но я хочу иметь несколько схожих функций для отправки других объектов.Спасибо за любые ответы!

Ответы [ 2 ]

1 голос
/ 12 января 2012

Фрагменты кода ниже работают со всеми любыми сериализуемыми объектами для меня. Пожалуйста, проверьте.

* IRequest - объект для отправки. * IResponse является объектом для получения.

Код клиента:

    Socket clientSocket = new Socket(hostName, portNo);
    clientSocket.setSoTimeout(connectionTimeout);
    try {
        OutputStream outputStream = clientSocket.getOutputStream();
        InputStream inputStream = clientSocket.getInputStream();
        ObjectOutputStream objOutputStream = new ObjectOutputStream(outputStream);
        ObjectInputStream objInputStream = null;

        try {
            objOutputStream.writeObject(request);
            objOutputStream.flush();
            objInputStream = new ObjectInputStream(inputStream);
            res = (IResponse) objInputStream.readObject();
        } finally {
            if (objOutputStream != null) {
                objOutputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
            if (objInputStream != null) {
                objInputStream.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        }
    } finally {
        clientSocket.close();
        clientSocket = null;
    }

Код сервера:

        private IMessageProcessor messageProcessor = null;
        private Socket clientSocket = null;
        private Logger logger = null;


        String clientIP = clientSocket.getInetAddress().getHostAddress();
        int clientPortNr = clientSocket.getPort();

        InputStream inputStream = clientSocket.getInputStream();
        OutputStream outputStream = clientSocket.getOutputStream();
        try {
            ObjectInputStream objInputStream = null;
            ObjectOutputStream objOutputStream = null;
            try {
                IRequest request = null;

                objInputStream = new ObjectInputStream(inputStream);
                objOutputStream = new ObjectOutputStream(outputStream);
                request = (IRequest) objInputStream.readObject();

                IResponse response = null;

                try {
                    response = messageProcessor.processMessage(clientIP,
                                                                clientPortNr,
                                                                request,
                                                                logger);
                    objOutputStream.writeObject(response);
                } catch (Exception ex) {
                    objOutputStream.writeObject(ex);
                }

                objOutputStream.flush();
                objOutputStream.reset();

            } finally {
                if (objInputStream != null)
                    objInputStream.close();
                if (objOutputStream != null)
                    objOutputStream.close();
            }
        } finally {
            inputStream.close();
            outputStream.close();
            clientSocket.close();
        }
    } catch (Exception ex) {
        logger.error(ex.getMessage());
    }
1 голос
/ 12 января 2012

Вам необходимо сериализовать свой класс Custom перед отправкой через сокет. Объект, который вы отправляете в

out.writeObject(list);

должен быть сериализован, ваш класс должен реализовывать интерфейс java.io.Serializable

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