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

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

ただいまの
回答率

90.04%

JavaのWebアプリケーションでのソケット通信実装について

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,560

前提・実現したいこと

Javaのwebアプリケーションにてソケット通信によるクライアントとサーバの電文送受信機能を実現したいと思っています。

初期処理としてサーブレットのコンテキストリスナによってそれぞれをソケットでつなぐ処理を行い、その後常時接続を維持します。

処理の流れ
1. ServletContextListenerにてソケット通信の接続のみを行う。

2. Servlet内でリスナ内で行なった接続情報を用いてデータの送受信を行う。送受信完了後もソケットは切断せず

発生している問題・エラーメッセージ

上記の機能を実装する上で初期処理にて作成したソケットオブジェクトをその後のEJBやサーブレットの処理の中で参照もしくはそのソケットオブジェクトの接続情報を別のインスタンスに持たせて電文の送受信を行いたいのですが、JavaのSocketクラスのAPIには既存、もしくは接続済みのSocketクラスのインスタンスを参照するメソッドがないため初期処理で行なった接続情報をその後の処理で参照する方法が思いつきません。

一応現在検討しているものはServletContextにリスナで使用したSocketクラスのインスタンスをsetAttributeしてその後のServletやEJBの処理にServletContextから取り出したオブジェクトを渡すという非効率な方法になります。

このようなソケット通信を行う際の良い方法は何かありますでしょうか?

補足情報(言語/FW/ツール等のバージョンなど)

IDE:NetBeans8.1
使用するアプリケーションサーバ:glassfish4.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • lib

    2016/03/20 21:11

    前提で電文送受信とありますが、具体的にどのようなやり取りを行うことを想定なんでしょうか?またソケットを選んだ根拠もお聞かせ願えれば。どうしてもweb上で行う必要性があるものでしょうか?

    キャンセル

  • nanashinoFooo

    2016/03/20 21:54

    私自身Java初心者であり、仕様への理解が出来ていないので具体的なお話は出来ないのですが、XML形式でTCP/IPで送られてきた電文の処理を行いTCP/IPでXML電文を返信する機能になります。
    選んだ理由は現行の機能更改のため、現行踏襲が方針でTCP/IPのソケット通信を採用しているためになります。
    web上で行う必要性も上記の理由となります。
    問題解決に繋がるお答えが出来ず申し訳有りません。

    キャンセル

回答 2

checkベストアンサー

+1

servletによる方式では有りませんが、効率的な方式を模索されているとのことでしたのでご参考までに回答いたします。JavaEEにてJSF+CDIとPrimeFacesのWebSocketタグを使用する方法があります。

下記はPrimeFacesのトップページ(英文)ですが、DocumentationのUsersGuidにタグ用法のサンプルが載っています。

PrimeFaces

また、socketで電文をやり取りする方式ではないのですがWebSocketタグとCDIBeanを使った簡易非同期チャットの作成方法をまとめています。(手前みそで済みません)

簡易非同期チャット作成

socket電文を直接ハンドリングするにはエンコードに手間が掛かりそうだったので、socketは「非同期なデータ発生の検出」だけに使用し、実際のデータのやりとりはCDIBean(BackingBean)間で行っています。JavaEEのフレームワーク内に閉じる場合、socket電文を直接やり取りする方式と等価と思っています。
尚、学習用サンプルである点はご了承下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/20 22:45

    「socket通信」に反応して回答してしまいましたが、追加情報を拝見するとRestサービスが向いているように思えます。WebポートでJSON形式の電文をやり取りする方式で、servletやJavaEEで実装可能です。

    キャンセル

  • 2016/03/21 02:12

    丁寧なご回答いただきありがとうございます。
    まだ初歩の初歩しか理解していなかったのでご連携いただいた情報を理解するにも時間がかかってしまいますが、サンプルを拝見して非同期通信や電文の処理に活かせるポイントがあり助かりました。

    こちらを参考にして作成してみます。
    またその過程で質問をすることがあると思いますが今回のご回答にはとても感謝しております。

    キャンセル

  • 2016/03/21 09:05

    お役に立てたようであれば幸いです。自分の理解している範囲は狭いですが、ヒントの出せそうなものは回答していきたいと思います。

    キャンセル

+1

ソリューションの提案になるため、一応の最適解としての回答は差し控えますが。
あくまで個人的な趣味の範囲内で

・RESTを検討してみてはいかがでしょうか。

詳細の別途回答は差し控えますが。考えの一助けになれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/20 22:42

    ご提案ありがとうございます。

    今までwebアプリを触ってこなかったので右も左もわからないのですが
    RESTについて勉強して今回の課題に照らしあわせてみます。

    少ない情報の中になりましたがありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる