
現在、仕事でソケット通信によるファイル転送処理をJavaで実装しています。
単体テスト、結合テストと転送先のサーバを変えて行っているうちに結合テスト用のサーバにファイル転送するタイミングで、0バイト受信をしてしまうことがわかりました。
(※サイズが小さいファイルに起きやすいのかもしれません。。。なぜ・・・)
プログラム内容は単体、結合とも同様です。
サーバは両方ともSolaris8です。
両者ともWeblogicを使用しています。
最初はプログラムでソケットが開きっぱなしなのでは?と疑いを持って、確認していましたが、単体環境で成功しているのに、結合環境で失敗するのを見ていると、転送先のサーバの設定やWeblogicに問題があるのでは?と思っています。
いろいろ調べてみたところ、下記サイトでそれっぽいことが書かれていましたが、実際にどの環境をどう直せば良いのかまでは至りませんでしたので、同じような経験がおありでしたら、是非ともアドバイスを頂きたく、質問させて頂きました。
■UNIXソケットプログラミング
http://hp.vector.co.jp/authors/VA003991/kouza/se …
お手数ですが、回答お待ちしております。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> サイズが小さいファイルに起きやすいのかもしれません
送信側端末の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様、貴重なご意見でしたので、ポイントは後日発行させて頂きます。
TO:bgbg様
早速のご回答ありがとうございました。
OutputStreamの実装箇所を確認してみたところ、おっしゃる通りflushが実行されていませんでした。
その部分を修正し、動作確認を行いましたので、おそらくこれで解決するとは思いますが、なにぶんテスト環境では動作が再現できないもので、、、
一時はテスト環境のAPorDBサーバのメモリサイズが極端に小さいのではないかと思い、確認してもらいましたが、テスト環境でも本番環境でも大した差はなく、バッファのメモリサイズオーバーによる自動flushでテスト環境はうまくFTP転送されていた訳ではなさそうです・・・
あとはその環境による動作結果の差異がわかれば完璧だと思うのですが。。。
とりあえず、flushは実装したので、ひと安心しております。
テスト環境での再現ができない件にて、何かアドバイスがありましたら、ご回答よろしくお願いします。
flushの件、本当に助かりました。
ありがとうございます。
No.3
- 回答日時:
javaでソケットI/Oを詳しく調べていないので、一概にはいえませんが、
ネットワークプログラミングの常識的な考えからいうと、ネットワークなのでこれぐらいの状況は普通のことだと思います。ネットワークプログラミングでは、10バイト受信しようとして2バイト受信したところで一旦recvが復帰するようなことは普通にあります。LAN上では一回で受信できることがほとんどでも、間にルータや高機能なブリッジが挟まると、IPパケットの分割や連続送信などの関連でこういったことが発生します。
それで普通は電文の最初に電文長を指定して、そのバイト数分受信するまで受信を繰り返します。
復帰値として-1か例外が発生しているのであればネットワークエラーと思えますが、0バイト受信でエラーとするのはどうでしょう...
どうしても気になるようでしたら、0バイト受信を繰り返す上限を(例えば連続10回まで)としておき、それを超える場合には警告をログに出力して切断するようにすればよいと思います。
できればIPトレースを取って、0バイト受信が発生した時のパケットを見てみるといいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- その他(メールソフト・メールサービス) メールが送信できない 発信側でできる対策 3 2023/05/11 10:22
- その他(メールソフト・メールサービス) Thunderbirdのメール送信ができません 1 2022/10/28 16:54
- サーバー メールサーバーについて詳しい方、メールサーバーの管理業務経験のある方、教えてください。 3 2022/11/12 18:24
- PHP a href リンクタグでだけで 送信が できちゃっています。 1 2022/04/18 04:25
- その他(クラウドサービス・オンラインストレージ) Onedriveで実現したい事。2台のPC間で。 2 2023/04/10 20:42
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- 電車・路線・地下鉄 ITパスポート試験問題 7 2023/01/25 09:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAでソケット通信(クライア...
-
TCP/IP通信時のサーバーからの受信
-
recv関数でフリーズしてしまう
-
C#とTCP/IPを利用したサーバー...
-
UDP通信におけるbind関数について
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
UDP/IPでのソケット作成につい...
-
closeされたsocketへの動作につ...
-
Macターミナルで実行中のプログ...
-
パソコンの演算速度について
-
実行時エラー429
-
2値化した画像の黒い部分のピク...
-
家電製品の電力周波数を変える機械
-
FOM出版の公認テキスト&問題集...
-
メモリのセグメント違反の解決...
-
VB.NETでMessageBoxを表示した...
-
VBAの配列サイズとメモリに関して
-
Amazonfireタブレットにわから...
-
電車で待機列の割り込みについ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
Socket通信の0バイト受信について
-
VB6のwinsockでconnectできない
-
ソケットでクライアントのipア...
-
ソケットを用いた1対多通信につ...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
相手のIPアドレスを取得する方法
-
recv関数でフリーズしてしまう
-
closeされたsocketへの動作につ...
-
送信したデータの一部が文字化...
-
UDP通信(SNMP)したいが、うま...
-
ソケット通信
-
Connectエラーが出てしまう・・...
-
WinSockでの通信プログラムがう...
おすすめ情報