そして、サイトイベントを配信するためのトランスポートとしてメールを使用することは一般的なアプローチの1つに過ぎないという考えに至りましたが、メッセージをほぼ瞬時に送信できるだけでなく、受信者のステータスを追跡し、イベントの配信を保証できるトランスポートもあります。 これらのトランスポートの1つはジャバーです。
実装に突入する前の少しの推論。
そのため、現時点では、サーバーはいつでも私に手紙を送ってきました。
- サイトから送信できる提案/コメント
- サイトからのファイルのダウンロードに関する情報
- 定期的に小さな統計
これらのイベントのすべてをいつでも配信する必要はありませんでした。「今すぐ誰かがサイトからファイルを取得している」という事実として、サイトからファイルをダウンロードすることに関する情報が必要です。 リクエストに応じて統計情報を取得する方が興味深いでしょう(はい、ページを作成できますが、そのようなページは通常モンスターになりますが、要約のようなものを見る必要があります)。 したがって、イベントの送信は次のようになります。
- サイトから送信できる提案/コメント - 常に送信
- サイトからのファイルのダウンロードに関する情報 - オンラインの場合にのみ送信されます
- 定期的に小さな統計 - 私がそれを見たかったとき
ちなみに、IMクライアントは自動的に起動し、メールクライアントよりもはるかに早く起動します。 サイトイベント
準備作業。
はじめに、サイトが機能するためのジャバーIDを取得しました。 承認リクエストに対するサイトのサポートを気にしませんでした。連絡先と承認を手動で追加するために必要なすべてのステップを実行しました。 これは単なる実験です。 将来、登録ユーザーをサーバーの連絡先リストにバインドする必要があります。
2番目に重要なことは、jabberプロトコルを操作するためのライブラリの選択です。 ネットワーク上の.NETには十分な数のプロジェクトがありましたが、特定のライブラリの最終的な選択はまだ行っていません。 比較を続けます。
クライアントをjabberサイトから作成します。
実装の準備がすべて整い、最初に書かれたコードはジャバーサーバーにログインし、サイトの開始時にオンライン連絡先に表示されました。
イベントの送信を開始します。
実際、開発全体はvoid SendMessageメソッド(Jid to、bool alwayssend、文字列形式、paramsオブジェクト[] args)を記述し、このメソッドを呼び出すことで構成されていました。 また、自動応答のための小さなメソッドを作成しました。
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
protected void processMessage(Jid jid, string text) { string cmd = new Regex( "\\s+" , RegexOptions.ECMAScript).Replace(text, " " ).ToLower(); switch (cmd) { case "?" : SendMessage(jid, false , ":\n" + " ? - \n" + "? - IP \n" + "? - \n" + " ? - ." ); break ; case " ?" : SendMessage(jid, false , Collector.GetSummary()); break ; case "?" : SendMessage(jid, false , Collector.GetIPs()); break ; case "?" : SendMessage(jid, false , Collector.GetPages()); break ; case " ?" : SendMessage(jid, false , Collector.GetServers()); break ; } } * This source code was highlighted with Source Code Highlighter .
これで、サイトが機能していることがわかり、必要なイベントを送信して質問に答えました。 これは私のサイトでチャットウィンドウがどのように見えるかです:

実際に留守番電話を書くことは難しくありません。
結果。
サイトイベントを配信するためのトランスポートとしてjabberプロトコルを使用するのは便利で複雑ではありません。 あなたはすぐに利点を見ることができます-すべてのイベントはいくつかのタイプに分けられ、接触しているユーザー(この場合は私)の存在と(必要に応じて)私の状態(邪魔しない、忙しいなど)にリンクできます:
- 重要なメッセージ-私が見なければならないもの
- 興味のあるイベントですが、オフラインになっている場合やステータスがワークロードを示している場合は、送信できません
- リクエストに応じて送信される情報-私がそれを見たかったときのみ、すなわち 通常、コマンドラインのように見えます:)
「いいね」の必要な文字の数が減り、99%のケースで読まずに削除されました。
一般的に、このようなソリューションの可能性は非常に高いことが判明しました。 たとえば、さらに進むことができます-登録プロセスを根本的に変更します:jabber IDのみを要求し、承認リクエストを送信し、初期データを引き出してパスワードを送信しますが、プロトコルを使用する低い普及率はそれを止めます。
サーバーでのテストメカニズムの実装は134行のコードに収まります。興味がある人はレイアウトできますが、このコードはライブラリに付属の例からほぼ完全に取られています。 結果が気に入っている限り、実験は継続されます。 Ahead-負荷テスト、サイト内の連絡先のリストと多数のアイデアとの緊密な作業。
追加:jabberを操作するためのコンポーネントについて
最初の価値のあるプロジェクトはJabber .NETです。私のドメインのメールとジャバーはGoogle Appsを介して動作するため、主な基準はgoogleの通常の動作であり、接続は問題なく動作します。 いくつかの欠陥がありますが、基本的な機能は非常によく提供されています。 私に合わなかったもの:
- System.ComponentModel.Componentからのオブジェクトの継承
- 複数のdll
- プロジェクトの構造は私には完全に理解不能であり、プロジェクトはあまりにも複雑です
2番目のプロジェクトはagsxmppです。現時点ではそれを使用していますが、ほとんどの場合、ライセンスのために拒否する必要があります。 繰り返しますが、それはグーグルでうまく動作します。ライブラリは最初のものよりも深刻です。
考慮される両方のライブラリには、Windows.Formsのコンポーネントが含まれていますが、最初はシャダーなしではそれらを見ることができません。次に、サーバー上でそれらは不要です。
私が見つけることができる他のすべては、サイトを勉強する段階ですでに脇に流されました。 ただし、優れたJScriptプロジェクトがいくつかあり、それらのいくつかは単純にC#に移植できます。