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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

Q&A

解決済

2回答

5175閲覧

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

nanashinoFooo

総合スコア9

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

0グッド

1クリップ

投稿2016/03/20 08:13

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

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

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

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

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

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

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

###補足情報(言語/FW/ツール等のバージョンなど)
IDE:NetBeans8.1
使用するアプリケーションサーバ:glassfish4.1

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

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

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

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

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

lib

2016/03/20 12:11

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

2016/03/20 12:54

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

回答2

0

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

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

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

投稿2016/03/20 13:32

lib

総合スコア446

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

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

nanashinoFooo

2016/03/20 13:42

ご提案ありがとうございます。 今までwebアプリを触ってこなかったので右も左もわからないのですが RESTについて勉強して今回の課題に照らしあわせてみます。 少ない情報の中になりましたがありがとうございました。
guest

0

ベストアンサー

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

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

PrimeFaces

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

簡易非同期チャット作成

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

投稿2016/03/20 13:30

BlueMoon

総合スコア1339

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

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

BlueMoon

2016/03/20 13:45

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

2016/03/20 17:12

丁寧なご回答いただきありがとうございます。 まだ初歩の初歩しか理解していなかったのでご連携いただいた情報を理解するにも時間がかかってしまいますが、サンプルを拝見して非同期通信や電文の処理に活かせるポイントがあり助かりました。 こちらを参考にして作成してみます。 またその過程で質問をすることがあると思いますが今回のご回答にはとても感謝しております。
BlueMoon

2016/03/21 00:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問