Клиентский сервер TCP - PullRequest
       12

Клиентский сервер TCP

1 голос
/ 20 декабря 2011

У меня вопрос по сети TCP / клиент / сервер.Я пытаюсь создать приложение чата.Мой план заключается в том, чтобы клиент отправлял объекты Conversation по сети (объект имеет состояние имени пользователя String и состояние CurrentMessage String).У меня вопрос, должен ли я создавать новый объект каждый раз, когда я отправляю сообщение?т.е. вызывать конструктор класса Conversation каждый раз, когда я хочу отправить новое сообщение?или я должен просто обновлять текущее состояние сообщения?У меня есть этот вопрос, потому что в данный момент он просто обновляет состояние, и вот что происходит:

Состояние currentMessage прекрасно обновляется на стороне клиента, но когда я отправляю объект беседы по сети и пытаюсьчтобы получить состояние currentMessage с другой стороны, я продолжаю получать исходное значение состояния.Почему это?Сервер продолжает ссылаться на исходное значение сообщения, которое я отправил в первый раз.

PS Я не хочу публиковать множество кода, поэтому я надеюсь, что кто-то может иметь общее представление о том, что я делаю неправильно

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

Используете ли вы класс ObjectOutputStream для сериализации вашего объекта беседы?Если это так, он будет кэшировать классы, которые вы уже записали в поток, так что даже когда вы изменяете значения на стороне клиента, каждый раз, когда вы пишете этот объект, он будет отправлять указатель на этот объект, что экономит много времении пропускная способность.К сожалению, это не всегда ваша цель, поэтому у вас есть два варианта:

  • Сбросить поток.Из JavaDoc:

Сброс будет игнорировать состояние любых объектов, уже записанных в поток.Состояние сбрасывается, чтобы быть таким же, как новый ObjectOutputStream.Текущая точка в потоке помечена как сброшенная, поэтому соответствующий ObjectInputStream будет сброшен в той же точке.Объекты, ранее записанные в поток, не будут считаться уже находящимися в потоке.Они будут снова записаны в поток.

Вы можете прочитать отличную статью об этом здесь .

  • Создайте новые экземпляры вашего объекта беседы, как вы предлагали.

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

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

1 голос
/ 20 декабря 2011

Я предполагаю, что вы используете ObjectOutputStream или что-то подобное?

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

Это происходит потому, что поток сохраняет состояние объекта, и если он отправляется снова, он не обновляется.Вам нужно использовать метод reset () после получения объекта, чтобы он снова обновился.

0 голосов
/ 20 декабря 2011

Вы можете использовать шаблон проектирования в полутяжелом весе.

По сути, вы можете иметь объект, который всегда один и тот же.Вы заверните это в другой объект.В вашем случае объект, который вы отправляете, будет одинаковым каждый раз.Единственное, что вы меняете, - это текст.

Хотя я не уверен, как работает ваш код, я так понимаю, (1) создайте новый объект для отправки каждый разили (2) создайте его и продолжайте задавать другой текст для отправки в нем (что-то вроде навесного веса).

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

Что касается вашего другого вопроса, я согласен с Мэттом и Хасламом.То, что вы отправляете, вероятно, кэшировано, поэтому вам нужно обновить его, или, скорее, сообщить Java, что оно было изменено.

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