2011-12-20 12 views
1

TCPクライアント/サーバーネットワークに関する質問があります。私はチャットアプリケーションを作成しようとしています。私の計画は、クライアントがネットワークを介して会話オブジェクトを送信することです(オブジェクトにはStringユーザー名状態とString currentMessage状態があります)。私の質問は、メッセージを送信するたびに新しいオブジェクトを作成するべきですか?つまり、新しいメッセージを送信するたびにConversationクラスのコンストラクタを呼び出します。またはちょうど私はcurrentMessage状態を更新する必要がありますか?TCPクライアントサーバー

currentMessage状態はクライアント側で正常に更新されますが、ネットワーク上で会話オブジェクトを送信して取得しようとすると、この問題が発生します。もう一方の側のcurrentMessage状態は元の状態値を保持し続けます。どうしてこれなの?サーバーは最初に送信した元のメッセージ値を参照し続けますか?私はいけない

PSはなりたい間違っているの

答えて

1

イム推測あなたがたObjectOutputStreamまたは類似のものを使用しているイムコードの連ので、誰かが一般的な考えを持っているかもしれないことを望んイムを投稿しますか?

この問題は、以前の私の自己でした。最初に送信するとうまく動作しますが、それ以降は正しく更新されません。

ストリームはオブジェクトの状態を保存し、再度送信された場合は更新されないためです。 再度更新するオブジェクトを受け取った後にreset()メソッドを使用する必要があります。

+0

ありがとう、はい私はこれが私が必要とする解決策だと信じています:) – oggiemc

0

あなたは基本的にあなたが常に同じであるオブジェクトを持つことができますflyweight design pattern.

を使用することができます。別のオブジェクトにラップします。 あなたの場合、送信するオブジェクトは毎回同じです。変更するのはテキストだけです。

私は私がそれを見る方法があり、あなたのコードがどのように動作するかわからないが、(1)新しいたびに送信するためのオブジェクトやを作成する(2)を作成し、送信するために別のテキストを設定しておきます(それはちょっとフライ級のような)です。

以前の方法では、これらの封筒の大きなリストを事前に割り当てて、メッセージを送信するときに1つずつ消費することができます。これにより、パフォーマンスが向上します。

あなたの他の質問については、MattとHasslamに同意します。送信しているものはおそらくキャッシュされているため、リフレッシュする必要があります。あるいは、Javaに変更が加えられたことを通知する必要があります。

1

ObjectOutputStreamクラスを使用して会話オブジェクトをシリアル化していますか?そうであれば、既にストリームに書き込んだクラスをキャッシュするので、クライアント側の値を変更しても、そのオブジェクトを書き込むたびに、そのオブジェクトへのポインタが送信され、時間が大幅に節約されますと帯域幅。残念ながら、それは常にあなたの目標ではないので、残しておいて2つの選択肢があります。

  • ストリームをリセットします。 JavaDocから:

リセットはすでに ストリームに書き込まれたすべてのオブジェクトの状態を無効にします。状態は、新しいObjectOutputStreamと同じにリセットされます。 ストリームの現在のポイントはリセットとしてマークされているため、対応するObjectInputStreamは同じポイントでリセットされます。ストリームに以前に書き込まれたオブジェクトは、既にストリームにある とは呼ばれません。彼らは再び川に書き込まれます。

このhereについての素晴らしい記事を読むことができます。

  • 提案したとおり、会話オブジェクトの新しいインスタンスを作成します。

私は個人的に新しいオブジェクトを作成するのではなく、すべての書き込みの前(または後)にストリームをリセットするのが賢明だと思いますが、オブジェクトの割り当てがかなり大きく、ネットワークの書き込みの間にいくつかのフィールドを変更するだけで、ストリームをリセットするほうが良いかもしれません。

しかし、この種の最適化は、実際のプロファイリングを行ってより効果的なものが見えるようになったときに、プロジェクトの後半に置くのが最善です。私のアドバイスは、あなたが最も快適なものを選んで、最適化が重要なポイントになるまで前進することです。早めに最適化することは、良いプログラミングの欠点です! :

+0

こんにちはmatthew、返信ありがとうございます。私はシリアル化を使用しています..私は新しいオブジェクトを毎回送信するコードを持っていたが、無駄になり、それをメッセージの状態を更新するだけに変更しました。だから、もし私が最初にやりたかった文字列の代わりにベクトルを更新していたら、どうすればいいのでしょうか?あなたはクライアントが最新のメッセージを要求するポーリングメカニズムを書いていますサーバーに投稿されます(これは文字列のベクトルで構成されます)。このベクトルをネットワーク経由でどのように送信しますか? – oggiemc

+0

つまり、ベクターが毎回新しいベクターにリセットされるたびに新しいオブジェクトを作成すれば、それは必要ありません。会話ストリングの完全なベクトルをサーバーからクライアントに送り返したいと思っています。私はそれを理解するのに十分に明確にしたかどうかは分かりません。 – oggiemc

+0

私は私の質問を信じています。新しいオブジェクトを作成するにはどうすればよいのですか?それも可能ですか?ありがとうございました – oggiemc

関連する問題