• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JAVAでソケット通信(クライアント)の際のbind方法)

JAVAでソケット通信(クライアント)の際のbind方法

このQ&Aのポイント
  • JAVA初心者です。アクセス元のIPアドレスで認証をしているサイトがあり、httpアクセスでそこから定期的に情報を取ってくるようなものをJAVAで作っています。
  • 対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。
  • 皆さんの知恵を貸していただければと思います。アドバイスよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.4

> ~~処理~~ ここがどうなっているのか分からないので、何とも言えないのですが、 単にBind、Connectするだけなら以下の通りです。 //ホスト名(xxxx)、ポート番号(yy)からアドレスを作る InetAddress a = InetAddress.getByName("xxxx"); InetSocketAddress b = new InetSocketAddress(a, yy); //ソケットを作る Socket s = new Socket(); s.bind(b);  //Bindの例 s.connect(b); //Connectの例

dora-baku
質問者

お礼

ありがとうございます。 この流れで考えている事が出来るか今試してみています。 結果を後ほどご報告します。 よろしくお願いします。

dora-baku
質問者

補足

出来ました。 //ホスト名(xxxx1)、ポート番号(yy1)から自アドレスを作る InetAddress a = InetAddress.getByName("xxxx1"); InetSocketAddress b = new InetSocketAddress(a, yy); //ホスト名(xxxx2)、ポート番号(yy2)から接続先アドレスを作る InetAddress c = InetAddress.getByName("xxxx"); InetSocketAddress d = new InetSocketAddress(c, yy2); //ソケットを作る Socket s = new Socket(); s.bind(b);  //Bindの例 s.connect(d); //Connectの例 こういう事がしたかったのですが、 s.bind(b);のところで、bindの使い方を誤っていただけのようです。 ここで InetSocketAddress d = new InetSocketAddress(c, yy2); として作成したオブジェクトを使わないといけないというところが わかっていませんでした。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.3

もしかして何か勘違いしているかもしれないので確認です。 >対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため という件から考えると、もしかしてbindというメソッドでクライアント上に作成したSocketに対して クライアントのIPアドレスとは別のIPアドレスを使用してサーバーへ接続しようとしているという事ですかね? であれば、そんなのできません。 単純に言うと ・クライアント上にsocketを作成 ・クライアント上のsocketにサーバーのIPアドレス、提供されたポートを接続(bind) ・通信開始 という流れですが、bindという処理を勘違いしてはないでしょうか?

dora-baku
質問者

補足

ここでのbindはソケットに対して自IPアドレス/ポートを割り当てるというつもりでお話しています。 >もしかしてbindというメソッドでクライアント上に作成したSocketに対して >クライアントのIPアドレスとは別のIPアドレスを使用してサーバーへ接続しようとしているという事ですかね? クライアントに複数のIPアドレスを割り当てていて、そのいずれかを選択してconnectしたいと考えています。 どうも私の言っている『bind』という言葉が、使い方がおかしいのかもしれませんね。 bindをとにかく使う、というわけではなく、ここでPHPの事を持ち出すのは おかしいのかもしれませんが、PHPでの socket_bind と同様の事が出来ればと考えています。 参考:http://phpspot.net/php/man/php/function.socket-bind.html よろしくお願いします。

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.2

ソケット通信ではサーバ側とクライアント側があります。更に 接続型と非接続型があります。HTTPなので接続型です。この場合、 サーバ側はソケットを作り、ネットワーク内に「サーバXがここに ある」という宣言をします。これがbindです。この操作は非接続型 でも行います。次いで、クライアントからのconnectを待ち受ける ため、acceptを行います。acceptは接続型のみ行います。 一方、クライアント側はソケットを作ったあと、サーバにconnect します。クライアントからのconnectを受け取ると、acceptは制御を 返し、新しいソケットを戻します。以降はサーバ/クライアント双方で send/receiveでデータをやり取りすることになります。 以上が簡単な説明です。 掲題のプログラムを見ますと、何とアドバイスしたらよいか見当が つきません。先ず、本を買うとか、"java"+"socket通信"あたりで ググってみて、通信の仕組みを理解されることを薦めます。

dora-baku
質問者

お礼

ありがとうございます。 ちなみに、PHPではconnectの際のソースIPアドレスの 指定は実現出来ています。 <?php $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // ソースアドレスをバインドする socket_bind($sock, 'ソースIPアドレス');   ~~処理~~ // 閉じる socket_close($sock); ?> スレッド化が必要など、言語の選定の段階でどうしてもJAVAにする必要が あったため、上記と同様の事をJAVAで再現しようと思っています。 既に1週間ほど、ご指定のワードでググって調べていますが クライアント側のソケット接続に関しては Socket socket = new Socket( argv[0], PORT ); などとなっており、最近のJAVAではこれで勝手にソースIPやポートが 割り当てられ接続までされてしまうというような内容を見ました。 当然接続してからソースIPアドレスの変更は不可能でしょうから、 空のソケットを作成してから何かしらの割り当て作業をするのかなと思っています。 質問に使っている言葉の使い方(ソースIP)などがそもそも誤っていたらすいません。 よろしくお願いします。

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

Bindというのはサーバ側の処置であって、クライアント側で実行する ものではありません。 クライアントがサーバに接続したいのであればconnectを使います。

dora-baku
質問者

お礼

ありがとうございます。 具体的にはどう書けばいいのでしょうか? connectに関して調べてみましたが、 Socketクラスに関してのドキュメントで http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/net/Socket.html このクラスは、クライアントソケット (単に「ソケット」とも呼ぶ) を実装します。 とあり、 メソッドの概要に bind(SocketAddress bindpoint) ソケットをローカルアドレスにバインドします。 とあるため、クライアント側もソケット接続時にbindで ソースIPアドレス、ポートを指定出来るものかと認識していました。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A