0

クライアント/サーバー アーキテクチャを使用して、Java で社内メッセージング システムを作成しています。実装したい機能は、特定のユーザーまたはユーザー グループへのリアルタイム チャットとメッセージ、ファイル転送とボイス チャットです。

クライアントがサーバーにログインできるサーバーとクライアントモジュールを実装しました。DataInputStreamこれにはandを使用しDataOutputStreamました。ユーザーがユーザー名とパスワードを送信すると、セミコロン「;」で区切られた単一の文字列にそれらを保存します。次に、この文字列をDataInputStream分離してサーバーに送信し、DB クエリを実行して、適切な確認応答をクライアント アプリケーションに送信します。

次に、チャットとメッセージングを実装したいと思います。私の質問は、これに同じアプローチを使用する必要があるかどうかです。または、より良い解決策はありますか?また、特定のクライアントにメッセージを送信するにはどうすればよいですか (クライアント A はクライアント B にのみメッセージを送信したい)。解決策を提案する際は、ファイル転送としてボイス チャット (gstreamer) も実装する必要があることに注意してください!!!

また、各クライアントにログインしているクライアントのリストを表示するために使用される、サーバーにログインするすべてのクライアントの名前を含む配列を維持します。

4

1 に答える 1

3

まず、ユーザー名とパスワードを平文の文字列として送信することで、事実上それらを無料で提供することになります。いくつかの基本的なツールがあれば、誰でもユーザー名とパスワードを盗み見られる可能性があります。暗号化と接続を保護する方法について読む必要があります。Java には組み込みの暗号化ライブラリがあり、これを非常に簡単に行うことができます。

可能であれば、XMPP (Jabber) のような開発済みのチャット プロトコルを使用することをお勧めします。このプロトコルには、Smack など、すべてを実行する多くの無料の Java ライブラリ実装が既に存在します。外部ライブラリの使用を許可しない学校のプロジェクトでこれを行う場合を除き、それ自体が非常に野心的である場合を除き、ここで車輪を再発明する必要はありません。XMPP は、テキスト チャット、ボイス チャット、およびファイル転送をサポートしています。

また、特定のニーズに合わせて変更できる、完全な機能を備えたオープンソースのチャット クライアントがすでにいくつかあります。ただし、心に留めておくべきことの 1 つは、オープンソース プロジェクトのライセンスです。一般的な GPL などの一部のオープンソース ライセンスでは、プロジェクトでオープンソース プロジェクトの一部を使用するには、プロジェクト全体のソース コードをリリースする必要があります。これは企業にとって非常に悲惨なことになる可能性があるので、気をつけてください。

それでもゼロから始めたい場合は、独自の通信プロトコルを実装する必要があります。gstreamer とファイル転送をどのように組み込むかを考慮しながら、これを自分で設計する必要があります。

繰り返しになりますが、アイデアを得るために、少なくとも XMPP などの既に設計されたプロトコルを確認することをお勧めします。

通常、プロトコルには、

  • これがどのタイプの要求/応答であるかを説明するいくつかのデータ。これは、1 バイトとして格納された数値、または HTTP で行われるようなテキスト文字列です。
  • メッセージの対象者に関するその他のデータ。IP アドレス、ユーザー名、両方の組み合わせなどを指定できます。直接通信を行う場合、つまり中間サーバーを介さない場合は不要です。
  • リクエストが送信された時刻
  • データそのもの
  • ある種の暗号化。ユーザーが承認された後に開始することをお勧めします

たとえば、本当に基本的なプロトコルは次のようになります。

リクエスト タイプ: 1 バイト。1 = テキスト、2 = 音声データ、3 = ファイル転送、4 = 現在ログインしているクライアント リストの要求

送信先: int (IPアドレス)

時間:長い。System.currentTimeMillis が返すものなど、これを UTC 時間として送信するのが最適です。

データの長さ: int

データ: タイプに応じた可変長データ

次に、送信されるデータの種類ごとに、データを異なる方法で実装します。

    
テキスト: DataStream によって送信された文字列

音声: gstreamer からの音声データ (gstreamer の仕組みがわからない)

ファイル転送:

    ファイル名: DataStream によって送信された文字列

    長さ: ロング

    データ: FileInputStream から読み取ったとおり

現在ログインしているクライアントのリスト:
    データ: DataStream.writeObject によって送信されたとおり

幸運を

于 2013-02-23T19:38:05.807 に答える