2010-05-01 12 views
0

Предположим, я хочу отправить много сообщений между двумя программами, созданными в java, которые используют сокеты TCP.Какая структура данных используется для связи через tcp/ip в java?

Я думаю, что самый convienient способ для отправки объектов, как:

PrintStream ps = new PrintStream(s.getOutputStream()); 

ObjectOutputStream oos = new ObjectOutputStream(ps); 

    some_kind_of_object_here; 

    oos.writeObject(some_kind_of_object_here); 

ps.print(oos); 

Я хочу отправить, строки, числа, HashMaps, логические значения Как я могу это сделать с помощью Fx 1 объект, который может хранить все что свойства? Я хоть о ArrayList, который сериализуем, и мы можем поместить туда все, но не изящным способом. Я хочу отправлять различные типы данных, потому что пользователь может выбирать из множества вариантов, которые сервер может сделать для него. Все советы?

+0

Мой совет: Попробуйте и посмотрите, как/если это работает! –

+0

я попытался и проблема заключается в том, что я не знаю, как читать этот объект (мой новый класс) я могу бросить его в какой-то идентичного класса, но UUID не то же самое, так что не удается – questioner

ответ

1

Master, вы знаете, вы можете отправить любой сериализации объект через сокет в другой виртуальной машины Java, да?

Если это так, то проще всего иметь сериализуемый объект, содержащий все ваши объекты, а затем просто переслать его. Список объектов, вероятно, самый простой. Затем вы можете выполнить десериализацию с другой стороны и обработать объекты в списке любым способом.

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

http://java.sun.com/javase/7/docs/technotes/guides/serialization/index.html

+0

это хорошая ссылка, я уже нашел там интересное, так – questioner

2

Считаете ли вы, что используете RMI?

В противном случае придерживаться Serializable или даже Externalizable, если вам нужна дополнительная производительность.

Вам не нужны классы-оболочки, такие как списки. Конечно, вы можете создать свой собственный объект-оболочку, который хранит все связанные данные. Такие «единицы данных приложений» помогут вам позаботиться о правильном заказе, который вы отправляете своим клиентам. Пока все члены являются Serializable, полный графический объект будет автоматически сериализован, как только вы поместите объект-оболочку в поток объектов.

Если вы не используете классы-оболочки, просто убедитесь, что каждый объект/тип, который вы хотите передать, реализует не менее Serializable. Затем вы должны убедиться, что порядок отправки данных соответствует порядку, за который вы хотите получить данные.

+0

Дa, я хочу использовать этот 1 большой объект, чтобы хранить всю информацию, но я не знаю, как читать его с другой стороны, Я могу сделать класс с теми же полями, но UUID (или sth вроде этого) не будет соответствовать – questioner

+0

Java делает все это для вы, как здесь: http://www.java2s.com/Code/Java/Network-Protocol/ServeentireobjectsusingObjectOutputStream.htm Вместо использования хэш-таблицы, как в примере, используйте свой произвольный класс, который должен существовать в пути к классам на обоих узлы. –

+0

Или я неправильно понял? Ваша проблема в том, что вы создаете КОПИИ объекта? Затем используйте RMI и экспортируйте свой объект. –

0

Если вам нужно сохранить небольшие пакеты, вы можете использовать простой Object[], поместить все, что хотите внутри, и использовать перечисление, которое указывает тип пакета, позволяя вам, сколько и какие объекты хранятся внутри сообщения.

class Message 
{ 
    Type t; 
    Object[] params; 
} 

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

+0

Если вы хотите сделать это, используйте Serializable []. Однако я не вижу здесь смысла. Просто используйте обычный класс и добавьте наши значения в качестве членов. Использование этого массива/списка просто увеличивает накладные расходы, когда вы должны отбрасывать типы в свои исходные типы при разборке. –

+0

Да, Serializable в порядке (но это просто ограничение, это на самом деле ничего не значит)! В любом случае вы можете сделать так, как предлагает PartlyCloudy, если у вас нет много разных пакетов с разными параметрами/типами параметров. – Jack

+0

Конечно, есть разница. Если вы поместите в массив несериализуемый объект, он будет сбой во время компиляции. В вашей версии он будет терпеть неудачу во время сортировки - что плохо. –

1

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

Просто напишите в ByteArrayOutputStream:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.write(javaObject); 
oos.close(); 
socket.write(baos.toByteArray()) 
+0

Нет необходимости в ByteArrayOutputStream, ObjectOutputStream обрабатывает все это автоматически. –

+0

Я знаю, как отправить такой объект, но я хочу отправить все эти строки, числа, HashMaps, логические значения в 1 объект, используя только: oos.write (This_1_big_powerfull_object); – questioner