Я не могу отправлять объекты через сокеты в Java

У меня такая проблема, и я не могу понять, что не так. Я искал по всему Интернету, но безуспешно.

Итак, мне нужно отправить объект через сокеты в Java, и я не могу понять, как это сделать. Я пробовал так много способов. Я сериализовал объект, я попытался написать объект напрямую. Но ничего не работает.

Деталь в том, что у меня параллельно работает чат. И иногда, когда я открываю ObjectOutputStream или ObjectInputStream, я попадаю в тупик. И я думаю, вы, ребята, могли бы мне помочь.

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

Сервер:

        try{
            socketConexao = socketRecepcao.accept();

    toClient = new DataOutputStream(socketConexao.getOutputStream());
    fromClient = new BufferedReader(new InputStreamReader(socketConexao.getInputStream()));

            //starts the chat
    Thread chat = new Thread(this);
    chat.start();

    }catch(IOException e){}

           //i dont really know how to send the object

    try{
        byte[] bytes = serialize(palavraSorteada);
        toClient.write(bytes);
    } catch (IOException e){
        e.printStackTrace();
    }

Клиент:

    socketCliente = new Socket(ip, port);

    toServer = new DataOutputStream(socketCliente.getOutputStream());
    fromServer = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));

            // starts the chat
    Thread chat = new Thread(this);
    chat.start();

    }catch(IOException e){System.exit (0);}

            // and dont really know how to receive the object

    try{
        ObjectInputStream os = new ObjectInputStream(socket.getInputStream());
        palavraSorteada = (Palavra) os.readObject();
        os.close();
    }catch(Exception e){
        e.printStackTrace();
    }

person bfagundes    schedule 24.09.2012    source источник
comment
Можете ли вы привести более простой пример того, что вы делаете? Там много кода, который не относится к вашему вопросу. Вы не объяснили, почему это не работает, или почему вы пишете двоичный код, но пытаетесь прочитать текст, или почему вы вообще используете DataOutputStream.   -  person Peter Lawrey    schedule 24.09.2012
comment
Возможно, стоит использовать одни и те же протоколы данных при отправке и получении... т. е. использовать ObjectOutputStream и ObjectInputStream, а не один.   -  person Ryan Amos    schedule 24.09.2012
comment
да, я понял это только сейчас. теперь работает. Спасибо.   -  person bfagundes    schedule 24.09.2012


Ответы (2)


Должно быть совершенно очевидно, что здесь не так (из вашего описания): вы используете один канал связи для отправки двух разных типов данных. Поскольку принимающая сторона не может предсказать, что она собирается получить, вам необходимо добавить информацию о том, что будет дальше, чтобы принимающая сторона знала, что делать.

И, вероятно, никто не будет утруждать себя выяснением того, что на самом деле делают ваши фрагменты кода, уменьшите ерунду до того, о чем вы хотите спросить, или даже лучше создайте исполняемый пример одного класса с возможностью копирования и вставки (длинный, как возможно), что демонстрирует проблему.

person Durandal    schedule 24.09.2012
comment
да, я пытался сделать так, потому что когда я ставлю ObjectOutputStream, я получаю тупик, клиент там зависает. - person bfagundes; 24.09.2012

На сервере разделите класс Server на Server (принимает соединения) и ServerConnection (отдельный поток). Поместите переменные toClient и fromClient в ServerConnection. Теперь вы портите эти переменные при подключении нового клиента.

В клиенте нет необходимости запускать новый поток.

person Alexei Kaigorodov    schedule 24.09.2012