JAVA初心者です。
アクセス元のIPアドレスで認証をしているサイトがあり、
httpアクセスでそこから定期的に情報を取ってくるようなものを
JAVAで作っています。
対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。
~~前略~~
Socket socket = new Socket(Host, 80);
bind(socket,"IPアドレス");
~~後略~~
もしくは
~~前略~~
Socket socket = new Socket();
bind(socket,"IPアドレス");
~~後略~~
など、いずれもうまくいきません。なお、クライアントマシンには使用するIPアドレスは全て定義済みです。
また、アクセス元(JAVAが動くPC)のIPアドレスを指定せず
デフォルトのままでアクセスする事自体は
~~前略~~
// Hostの内容はyahoo.co.jp等特にアクセスの制限の無いサイトのもの
Socket socket = new Socket(Host, 80);
~~後略~~
とすることで接続出来ました。
皆さんの知恵を貸していただければと思います。
アドバイスよろしくお願いいたします。
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の例
この回答への補足
出来ました。
//ホスト名(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);
として作成したオブジェクトを使わないといけないというところが
わかっていませんでした。
ありがとうございました。
ありがとうございます。
この流れで考えている事が出来るか今試してみています。
結果を後ほどご報告します。
よろしくお願いします。
No.3
- 回答日時:
もしかして何か勘違いしているかもしれないので確認です。
>対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため
という件から考えると、もしかしてbindというメソッドでクライアント上に作成したSocketに対して
クライアントのIPアドレスとは別のIPアドレスを使用してサーバーへ接続しようとしているという事ですかね?
であれば、そんなのできません。
単純に言うと
・クライアント上にsocketを作成
・クライアント上のsocketにサーバーのIPアドレス、提供されたポートを接続(bind)
・通信開始
という流れですが、bindという処理を勘違いしてはないでしょうか?
この回答への補足
ここでのbindはソケットに対して自IPアドレス/ポートを割り当てるというつもりでお話しています。
>もしかしてbindというメソッドでクライアント上に作成したSocketに対して
>クライアントのIPアドレスとは別のIPアドレスを使用してサーバーへ接続しようとしているという事ですかね?
クライアントに複数のIPアドレスを割り当てていて、そのいずれかを選択してconnectしたいと考えています。
どうも私の言っている『bind』という言葉が、使い方がおかしいのかもしれませんね。
bindをとにかく使う、というわけではなく、ここでPHPの事を持ち出すのは
おかしいのかもしれませんが、PHPでの
socket_bind
と同様の事が出来ればと考えています。
参考:http://phpspot.net/php/man/php/function.socket-b …
よろしくお願いします。
No.2
- 回答日時:
ソケット通信ではサーバ側とクライアント側があります。
更に接続型と非接続型があります。HTTPなので接続型です。この場合、
サーバ側はソケットを作り、ネットワーク内に「サーバXがここに
ある」という宣言をします。これがbindです。この操作は非接続型
でも行います。次いで、クライアントからのconnectを待ち受ける
ため、acceptを行います。acceptは接続型のみ行います。
一方、クライアント側はソケットを作ったあと、サーバにconnect
します。クライアントからのconnectを受け取ると、acceptは制御を
返し、新しいソケットを戻します。以降はサーバ/クライアント双方で
send/receiveでデータをやり取りすることになります。
以上が簡単な説明です。
掲題のプログラムを見ますと、何とアドバイスしたらよいか見当が
つきません。先ず、本を買うとか、"java"+"socket通信"あたりで
ググってみて、通信の仕組みを理解されることを薦めます。
ありがとうございます。
ちなみに、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)などがそもそも誤っていたらすいません。
よろしくお願いします。
No.1
- 回答日時:
Bindというのはサーバ側の処置であって、クライアント側で実行する
ものではありません。
クライアントがサーバに接続したいのであればconnectを使います。
ありがとうございます。
具体的にはどう書けばいいのでしょうか?
connectに関して調べてみましたが、
Socketクラスに関してのドキュメントで
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ …
このクラスは、クライアントソケット (単に「ソケット」とも呼ぶ) を実装します。
とあり、
メソッドの概要に
bind(SocketAddress bindpoint)
ソケットをローカルアドレスにバインドします。
とあるため、クライアント側もソケット接続時にbindで
ソースIPアドレス、ポートを指定出来るものかと認識していました。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 インストールしたてのVirtualBoxの仮想マシンにDHCPで割り振られるIPアドレスにつきまして 1 2023/05/03 14:46
- ネットワーク 一台のサーバーに複数個のIPアドレスを追加出来る事は知っていますが、具体的にどうやるのでしょうか? 4 2022/11/03 20:12
- その他(インターネット接続・インフラ) ブラウザにIPアドレス入力した時 1 2022/06/16 19:08
- サーバー ネットワークの構成に困っています 3 2023/07/05 11:55
- システム システムにインターネットからアクセスする際、URLではなく、IPアドレスでブラウザからアクセスするこ 2 2022/07/28 09:52
- VPN 無料のwifiはなぜ危険性高い? VPN プライベートDNSモードにすれば安全? 2 2022/06/04 18:23
- その他(インターネット接続・インフラ) アプリ利用者を特定し、裁判に 2 2022/06/09 21:43
- ネットワーク 自作のサーバーPCが自宅内のネットワークに接続できない 3 2023/01/24 16:58
- VPN 接続のたびにIPが変わるVPNサービスが知りたい 2 2022/06/27 02:34
- YouTube youtube動画再生について… 1 2022/04/08 04:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
WinSockでの通信プログラムがう...
-
エクセル VBA でのCOMポート...
-
recv関数でフリーズしてしまう
-
UDP通信(SNMP)したいが、うま...
-
UDPで受信終了の合図を出して受...
-
Winsockで接続待ちタイムアウト...
-
JavaでBASIC認証突破
-
クライアントソケットMACアドレ...
-
UDP通信におけるbind関数について
-
winsockでファイル転送
-
VB6のwinsockでconnectできない
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
-
バインドと接続(BindException...
-
空きポートの取得方法
-
ソケット通信 同じポート番号...
-
ソケットのrecvの戻り値が0
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
相手のIPアドレスを取得する方法
-
ソケットでクライアントのipア...
-
VB6のwinsockでconnectできない
-
Connectエラーが出てしまう・・...
-
ソケット通信の送受信遅延-02 ...
-
同じLAN内パソコンのIPアドレス...
-
WinSockでの通信プログラムがう...
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
おすすめ情報