Отправить массив через сокет с помощью ObjectInputStream

Я пытаюсь отправить содержимое массива строк через сокет, а затем распечатать элементы массива на другом конце.

Я пытался использовать ObjectInputStream, но безуспешно. Если честно, я прошерстил Интернет, но до сих пор не знаю, что делаю.

Клиент

Помещение объектов в массив

String[] sendServer = new String [4];

{
    sendServer[0] = txtUsername.getText();
    sendServer[1] = dateFormat.format(date);
    sendServer[2] = txtMessageOut.getText();
    sendServer[3] = "I HOPE THIS WORKS!!!";
}

Сокет был создан другим методом, и я могу выйти, просто не уверен, правильно ли это?

ObjectOutputStream objectStream = new ObjectOutputStream(clientSocket.getOutputStream());
objectStream.writeObject(sendServer);

System.out.println(sendServer[0]);
System.out.println(sendServer[1]);
System.out.println(sendServer[2]);

А насчет сервера я понятия не имею. Я безуспешно пытался использовать ObjectInputStream. Сокет на сервере просто называется socket.

Любая помощь или указатели будут очень признательны.


person Adam Jarvis    schedule 02.04.2015    source источник
comment
«Не повезло» — это не описание проблемы.   -  person user207421    schedule 03.04.2015
comment
@Aify Понижение было за то, что вы не ответили на вопрос.   -  person user207421    schedule 03.04.2015


Ответы (1)


Я хочу дать вам фрагмент кода. Отправитель и получатель используют сокет для связи. Замените Request своей структурой данных и удалите ненужные строки кода.

Это отправитель:

private Response doUnicastTCP(Server remoteServer, Request request) throws ServerException {
                Socket clientSocket = null;
                ObjectOutputStream outToServer = null;
                ObjectInputStream inFromServer = null;
                try {
                    if (isStarted()) {
                        request.setRequestType(RequestType.UNICAST_TCP);
                        // LOGGER.debug("Sending " + request.getRequestType() + " "
                        // + request);
                        clientSocket = new Socket(remoteServer.getHost(), remoteServer.getUnicastTCPPort());
                        clientSocket.setSoTimeout(request.getTimeout());
                        outToServer = new ObjectOutputStream(clientSocket.getOutputStream());
                        inFromServer = new ObjectInputStream(clientSocket.getInputStream());
                        outToServer.writeObject(request);
                        Response response = (Response) inFromServer.readObject();
                        // LOGGER.debug("Received " + request.getRequestType() + " "
                        // + response);
                        if (response.getReturnValue() instanceof Exception) {
                            throw new ServerException((Exception) response.getReturnValue());
                        }
                        return response;
                    } else {
                        throw new ServerNotStartedException();
                    }
                } catch (SocketTimeoutException e) {
                    throw new ServerException("cant execute request " + request + " on server " + remoteServer + " "
                            + e.toString());
                } catch (ClassNotFoundException | IOException e) {
                    throw new ServerException("cant execute request " + request + " on server " + remoteServer + " "
                            + e.toString());
                } finally {
                    try {
                        if (clientSocket != null) {
                            clientSocket.close();
                        }
                    } catch (IOException e) { //
                        LOGGER.trace("socket couldn't be closed");
                    }
                }
            }

Это приемник:

public void run() {
            Request r = null;
            try {
                ObjectInputStream inFromClient = new ObjectInputStream(s.getInputStream());
                ObjectOutputStream outToClient = new ObjectOutputStream(s.getOutputStream());
                while (isStarted()) {
                    final Object receivedObject = inFromClient.readObject();
                    // LOGGER.debug("Receiving "
                    // + ((Request) receivedObject).getRequestType() + " "
                    // + receivedObject);
                    r = (Request) receivedObject;
                    processId.set(r.getProcessId());
                    Response rs = new Response();
                    rs.setRequest(r);
                    rs.setServerFrom(GoldenNodeServer.this);
                    if (getOperationBase() != null) {
                        try {
                            Object s = ReflectionUtils.callMethod(getOperationBase(), r.getMethod(), r.getParams());
                            rs.setReturnValue(s);
                        } catch (Exception e) {
                            rs.setReturnValue(e);
                        }
                        outToClient.writeObject(rs);
                    } else {
                        rs.setReturnValue(new NoClientProxySetException());
                    }
                }
            } catch (EOFException e) {
                // LOGGER.trace("eof occured");
            } catch (SocketException e) {
                if (e.toString().contains("Socket closed") || e.toString().contains("Connection reset")
                        || e.toString().contains("Broken pipe")) {
                } else {
                    stop();
                    LOGGER.error("Error occured" + (r == null ? "" : " while processing " + r) + " ", e.toString());
                }
            } catch (IOException | ClassNotFoundException e) {
                stop();
                LOGGER.error("Error occured" + (r == null ? "" : " while processing " + r) + " ", e.toString());
            } finally {
                tcpProcessors.remove(this);
            }
        }
person Ozgen    schedule 02.04.2015