![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
現在、仕事でソケット通信によるファイル転送処理を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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】甲子園での思い出の残し方
「球場の砂を持って帰る」はもう古いと思った高校球児が、甲子園で負けた際に、思い出に残そうと思って行ったこと
-
ソケットのrecvの戻り値が0
C言語・C++・C#
-
0byteデータの送信と受信
C言語・C++・C#
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
6
recv関数の戻り値について
C言語・C++・C#
-
7
C# ソケット通信でデータ受信時の欠損について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
recv関数でフリーズしてしまう
-
ソケットのrecvの戻り値が0
-
エクセル VBA でのCOMポート...
-
カードリーダーのデータ受信方法
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
UDPの宛先ポートと送信元ポート...
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
Connectエラーが出てしまう・・...
-
WinSockを用いたUDP送受信ソケ...
-
UDP通信する時に、相手にどうや...
-
ソケットとそれに基づくストリ...
-
ソケットのクローズについて
-
ソケット通信 同じポート番号...
-
winsockでファイル転送
-
Winsockを使わずにVBでSocketを...
-
異なる言語間でのソケット通信...
-
マルチスレッドプログラミング...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
Winsockで接続待ちタイムアウト...
-
UDP通信におけるbind関数について
-
VB6のwinsockでconnectできない
-
ソケットのrecvの戻り値が0
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
ソケット通信 同じポート番号...
-
CreateFile関数でCOMポートが開...
-
Connectエラーが出てしまう・・...
-
ソケットでクライアントのipア...
-
ソケットを用いた1対多通信につ...
-
UdpClient 送信元のIPアドレ...
-
WinSockでの通信プログラムがう...
-
SIPがNATを越えられない理由
-
ソケットプログラミングに関す...
-
相手のIPアドレスを取得する方法
おすすめ情報