アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、仕事でソケット通信によるファイル転送処理をJavaで実装しています。
単体テスト、結合テストと転送先のサーバを変えて行っているうちに結合テスト用のサーバにファイル転送するタイミングで、0バイト受信をしてしまうことがわかりました。
(※サイズが小さいファイルに起きやすいのかもしれません。。。なぜ・・・)
プログラム内容は単体、結合とも同様です。
サーバは両方ともSolaris8です。
両者ともWeblogicを使用しています。
最初はプログラムでソケットが開きっぱなしなのでは?と疑いを持って、確認していましたが、単体環境で成功しているのに、結合環境で失敗するのを見ていると、転送先のサーバの設定やWeblogicに問題があるのでは?と思っています。

いろいろ調べてみたところ、下記サイトでそれっぽいことが書かれていましたが、実際にどの環境をどう直せば良いのかまでは至りませんでしたので、同じような経験がおありでしたら、是非ともアドバイスを頂きたく、質問させて頂きました。

■UNIXソケットプログラミング
http://hp.vector.co.jp/authors/VA003991/kouza/se …

お手数ですが、回答お待ちしております。
よろしくお願いします。

A 回答 (3件)

> サイズが小さいファイルに起きやすいのかもしれません


送信側端末のOutputStreamをcloseする前にちゃんとflushしていますか?

0バイト受信対策としては、read(byte[] b) でinputStreamからデータを取得し、戻り値が0だったら通信の終了とみなせば良いのではないでしょうか。
提示されたURLのドキュメントにはそのようなことが書いてあります。

ただ、通信の遅延でストリームからデータが取れない場合もありますので、そこはうまく実装する必要があるでしょう。

この回答への補足

引き続き、不具合の調査を行っております。
bgbgさんのおっしゃる通り、プログラム的におかしい箇所は修正し、
動作確認を行いました。しかし、同不具合がいまだ発生しており、開発環境では発生せず、本番環境で発生することからネットワークの設定もおかしいのではないかと疑っています。
ソケット通信で検索して、下記URLにソケットバッファの設定が記述されていたので、その辺りも関係してくるのではないかと思っています。
現在はサーバ管理者にその旨を指摘し、調査を行ってもらっていますが、なにぶんこういったケースは初めてなもので、皆様の経験談をアドバイス下されば心強いと思っております。
ちなみに失敗するケースとして現時点でわかっていることは、
・432バイトのFTP転送では失敗し、852バイトのFTP転送は成功。
・テスト環境下での検証では上記不具合は再現せず。
・テスト環境、本番環境ともに使用OS、バージョンは同じ。
となっております。

何卒、アドバイスありましたら、宜しくお願い致します。

■ソケットバッファについて
http://www.nal.ics.es.osaka-u.ac.jp/~t-tugawa/no …

※bgbg様、貴重なご意見でしたので、ポイントは後日発行させて頂きます。

補足日時:2007/02/26 20:16
    • good
    • 0
この回答へのお礼

TO:bgbg様

早速のご回答ありがとうございました。
OutputStreamの実装箇所を確認してみたところ、おっしゃる通りflushが実行されていませんでした。
その部分を修正し、動作確認を行いましたので、おそらくこれで解決するとは思いますが、なにぶんテスト環境では動作が再現できないもので、、、
一時はテスト環境のAPorDBサーバのメモリサイズが極端に小さいのではないかと思い、確認してもらいましたが、テスト環境でも本番環境でも大した差はなく、バッファのメモリサイズオーバーによる自動flushでテスト環境はうまくFTP転送されていた訳ではなさそうです・・・

あとはその環境による動作結果の差異がわかれば完璧だと思うのですが。。。
とりあえず、flushは実装したので、ひと安心しております。

テスト環境での再現ができない件にて、何かアドバイスがありましたら、ご回答よろしくお願いします。

flushの件、本当に助かりました。
ありがとうございます。

お礼日時:2007/02/26 14:28

javaでソケットI/Oを詳しく調べていないので、一概にはいえませんが、


ネットワークプログラミングの常識的な考えからいうと、ネットワークなのでこれぐらいの状況は普通のことだと思います。ネットワークプログラミングでは、10バイト受信しようとして2バイト受信したところで一旦recvが復帰するようなことは普通にあります。LAN上では一回で受信できることがほとんどでも、間にルータや高機能なブリッジが挟まると、IPパケットの分割や連続送信などの関連でこういったことが発生します。
それで普通は電文の最初に電文長を指定して、そのバイト数分受信するまで受信を繰り返します。
復帰値として-1か例外が発生しているのであればネットワークエラーと思えますが、0バイト受信でエラーとするのはどうでしょう...
どうしても気になるようでしたら、0バイト受信を繰り返す上限を(例えば連続10回まで)としておき、それを超える場合には警告をログに出力して切断するようにすればよいと思います。
できればIPトレースを取って、0バイト受信が発生した時のパケットを見てみるといいと思います。
    • good
    • 0

FTP転送を自前で処理されているのですか?

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています