質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

1回答

2843閲覧

ロングポーリングでユーザーごとに異なったレスポンスを返したい

jiro-sima

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/08/28 22:15

現在ロングポーリングを用いてSNSアプリケーションを作れないかと考えています
しかし下記のコードでは全てのメッセージを対象にした更新は出来てもユーザーごとに異なったレスポンス、例えば
あるユーザーがフォローしている相手のコメントを選別して返すというようなことは出来ません

そこでデータベースへの問い合わせにユーザー情報を付随させる、或いはデータベースから取得した情報をユーザーごとに
フィルタリングする方法などがあれば教えてください
なおロングポーリングの手法はこちらの"Comet(ロングポーリング) 非同期"のサンプルを参考にしました

java

1package servlet; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.util.ArrayList; 6import java.util.HashMap; 7import java.util.List; 8import java.util.Map; 9import java.util.Timer; 10import java.util.TimerTask; 11import java.util.concurrent.CopyOnWriteArrayList; 12 13import javax.servlet.AsyncContext; 14import javax.servlet.ServletConfig; 15import javax.servlet.ServletException; 16import javax.servlet.annotation.WebServlet; 17import javax.servlet.http.HttpServlet; 18import javax.servlet.http.HttpServletRequest; 19import javax.servlet.http.HttpServletResponse; 20import javax.servlet.http.HttpSession; 21 22import com.fasterxml.jackson.databind.ObjectMapper; 23 24import dao.CommentDAO; 25import model.ActiveUser; 26import model.CommentSet; 27 28 29@WebServlet(name = "UpdateMessage", urlPatterns = { "/UpdateMessage" }, asyncSupported = true) 30public class UpdateMessage extends HttpServlet { 31 private static final long serialVersionUID = 1L; 32 int count; 33 List<AsyncContext> queue = new ArrayList<>(); 34 35 public void init(ServletConfig config) throws ServletException { 36 super.init(); 37 //5秒ごとに更新 38 Timer timer = new Timer(); 39 TimerTask task = new TimerTask() { 40 @Override 41 public void run() { 42 count++; 43 //新着メッセージをDBから取得 44 CommentDAO commentDAO = new CommentDAO(); 45 List<Map<String, String>> result = commentDAO.selectNewComment(); 46 broadcast(result); 47 } 48 }; 49 timer.schedule(task, 5000, 5000); 50 } 51 52 synchronized public void broadcast(List<Map<String, String>> result) { 53 CopyOnWriteArrayList<AsyncContext> target = new CopyOnWriteArrayList<>(queue); 54 synchronized (queue) { 55 queue = new ArrayList<>(); 56 } 57 for(AsyncContext context : target) { 58 HttpServletResponse response = (HttpServletResponse) context.getResponse(); 59 response.setContentType("application/json"); 60 try { 61 ObjectMapper mapper = new ObjectMapper(); 62 String json = mapper.writeValueAsString(result); 63 System.out.println(json); 64 response.setContentType("application/json;charset=UTF-8"); 65 PrintWriter writer = response.getWriter(); 66 writer.print(json); 67 writer.close(); 68 context.complete(); 69 } catch(IOException e) { 70 e.printStackTrace(); 71 } 72 } 73 } 74 75 @Override 76 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 77 try { 78 final AsyncContext context = request.startAsync(); 79 queue.add(context); 80 }catch(IllegalStateException e) { 81 e.printStackTrace(); 82 } 83 } 84}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

あるユーザーがフォローしている相手のコメントを選別して返す

実現する方法はいくつかあると思いますが例として

1.リクエストにユーザーの認証情報を付加

  • user_id などの情報をクライアントがリクエストに付加する
    • もしsecureである必要があると単に user_id だと用意に他の人もアクセスできてしまうので、認証の部分作る必要あり
  • queue にその情報を保存
  • broadcast 時に user_id でフィルタ

2.HTTPリクエストを挟む

  • broadcast は現状の仕組み
    • ただ、全コメント流れてしまうので secure ではない
  • Commentを取得するようなHTTPエンドポイントを用意する
    • ここにフォローしているか?新着か?などのロジックで内容や返す返さないを実装
  • ユーザー側で boardcast のレスポンスをそのまま出すのではなく、その comment_id なりでもう一度????のエンドポイントにリクエスト
  • ユーザー側で 返ってきた内容を表示

のような感じですかね?ただ、実サービスを作る場合、どちらもセキュアでないかつ Commet よりも Websocket が利用できる場合そのほうがパフォーマンス等優れているために

Socket.io Websocket / Commet を実装したライブラリ
Pusher リアルタイム通信のための HTTP API を用意したサービス

等利用を検討するとよいかと思います。

投稿2019/09/01 17:40

編集2019/09/01 17:45
unhappychoice

総合スコア1531

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問