• ベストアンサー

サーバからクライアントにポート番号を指定する方法

java初心者です。 現在javaを使ってサーバとクライアントのsocketプログラムを作っています。 動作としてはサーバ側がクライアントに対して接続するポートを指定し、以後クライアントがサーバに対して通信を行う際には指定されたポート番号を使って通信を行うような動作をさせたいのですがうまくいきません。 そのため、みなさんの知恵を拝借したいのですが、アドバイス等頂けないでしょうか。 また、javaでは実現不可能だとするのでしたら、その理由も詳しく教えていただけると幸いです。 どうぞよろしくお願いします。

  • Java
  • 回答数6
  • ありがとう数1

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

  • ベストアンサー
  • NARH
  • ベストアンサー率82% (88/107)
回答No.3

FTP のPASV モードのような振る舞いですね。 であれば、Javaで実装されたFTPサーバのソースが参考になるのではないでしょうか? 例えば http://mina.apache.org/ftpserver/ あたりでしょうか? ただ、その方式をとるに至った要件が同時アクセスのためのポートの占有回避であれば、 普通に java.net.ServerSocket で実装してしまえば、面倒な事はあまり意識せずに実現できるのではないかと思います。

siranuision
質問者

お礼

なるほど、FTPでPASAモードという似たような振る舞いをするものがあったのですか。 そちらについても少し調べて参考にしてみます。ありがとうございます。 そして質問をする以前の状態で質問をしたみたいで申し訳ありませんでした。 とりあえずは他の皆様も言うとおり、もう少し自分で試すなり行なってから質問をするよう心がけます。

その他の回答 (5)

回答No.6

だから、 手法そのものは別に問題はない。 あなたの考えた方法は別にむずかしくはない。 でも あなたが何について悩んでいるのかわからない、

  • notnot
  • ベストアンサー率47% (4847/10258)
回答No.5

No1です。 補足は、 1.クライアントからサーバーのAポートに接続する 2.サーバーから番号Xをクライアントに送る 3.クライアントはサーバーとのセッションを一度切る 4.クライアントからサーバーのXポートに接続する ということでしょうか? どこにも難しさは無いと思うのですが、何が難しいのですか?

回答No.4

いや、 具体的っていうのは うまくいかない、というのはどういうことですか?と 例えば こういうプログラムを作ってみたけど この部分でこういうエラーが出ています、 どのようにすれば解決できるでしょうか? と、 そういうレベルで書かないと答えようがないよということ。 妄想レベルのことをどうでしょうか?と聞かれてもね。 やろうとしていることはJavaであるとか関係なく出来ます。 問題があるとすればJava以外の問題であることが多いでしょう。 任意のポート番号を開くにはOSの権限やセキュリティーソフトの設定などが 必要なことがありますよ。 一部でもいいのでソースをさらすとかしないと

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

どこがうまくいかないんでしょうか? それがわからないというのであれば、まずはそれを調べるべきじゃないかな。

  • notnot
  • ベストアンサー率47% (4847/10258)
回答No.1

もう少し具体的に書いてくれないことには、何とも言いがたいです。

siranuision
質問者

補足

サーバ・クライアントをまずsocketで接続し、その際にサーバ側の現在接続しているものと別のポート番号をクライアント側に通知する、という説明でどうですかね? クライアント側がサーバの指定した新たなポート番号で接続できるようにしたいので、最初のソケット接続でポート番号自体をクライアントに渡せればいけるのではないかと考えているのですが・・・。 ちなみに一回目の接続と二回目の接続は両方同じIPで行う予定です。

関連するQ&A

  • クライアント側のポート番号を指定しての通信

    クライアント側で、自身のポート番号を指定して通信したい場合どうすれば良いですか?

  • クライアントサーバ型アプリ製造時のポート番号は?

    初心者的質問で申し訳ありません。 クライアントサーバ型のアプリケーションを製造するとき、サーバ側のプログラムに固定のポート番号を割り当てないと、通信ができないですよね? 例えば、40000にしよう!と決めたとして、サーバPCは、40000=(製造した)サーバプログラムというのをどうやって認識するのでしょうか?サーバPC側での定義をするのですか?

  • TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが

    TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが取得するプログラムで、 while(1) { saddr.sin_port=htons(port); port++; fprintf(stdout, "%d\n", port); } のようなのをプログラムのどこに入れれば よいのでしょうか?

  • ServerSocketでポート番号指定する場合

    はじめまして。 私は、今、WEBサーバプログラムをJavaでやろうとしています。 そこで、ServerSocket(nPort)を使い、ポート番号は80を指定して、サーバーソケットを作成しようとしているのですが、エラーが表示され、作成できません。 ポートを開けないようなんですが、エラーメッセージを見てもどの部分が悪いのか検討もつかない状態です。 下記にエラー内容を載せておきます。 java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind ポートが開けませんでした。 エラー出力がこれだけなんですが、どうやったら解決できるでしょうか? ソースはhttp://www5c.biglobe.ne.jp/~ecb/java/java00.htmlにある、17.中間試験の回答例にあります。 自分はWindowns7 64bit Eclipse 3.6を使用しています。

    • ベストアンサー
    • Java
  • クライアント側のポート番号

    ネットワークの勉強を始めたばかりの者です。 ポート番号に関する本で、HTTPポートに関して次のように書いてありました。 「HTTPポートは、WebブラウザでWebページを閲覧するときに使用される「HTTPプロトコル」を用いて通信を行う際にデータが通過するポートです。 HTTPプロトコルでは、通信の際だけ80番のHTTPポートを開き、通信が完了するとポートは閉じます。 例えば、あるWebページをWebブラウザに表示するにあたり、表示されるまでは、そのWebページのデータを受信している状態なので80番ポートは開いていますが、Webページデータを完全に受信し終わり、Webブラウザに表示されたら80番ポートは閉じます。 つまり、一回の通信毎に80番ポートを開けたり閉じたりを繰り返しています。」 私は、変だと思いました。 私は、クライアント側のポート番号は、その場で適当な番号が割り当てられるものだと思っているからです。 上の引用の中で、80番というWell-Knownポートで受信しているという話は解せなのです。 どう読んでも、上記の引用部分はクライアント側の話なのです。 (サーバ側はクライアント側(ブラウザ)からいつ要求されるかわからないから、「開けたり閉じたり」ということはないと思うのです。) http://www.mm-labo.com/computer/tcpip/ipaddress/portsort.html このページにも、「クライアント側で使用するポート番号は各OSが動的に割り当てる」と書いてあります。 私がしている勘違いはなんでしょうか。

  • Winsockでクライアントのポート番号を設定したいです

    環境はWin2000,VC++6.0,MFC,ダイアログベースです Winsockではサーバ側のポート番号を指定しますよね。 クライアント側のポート番号を設定したいのですができますでしょうか? acceptされるポート番号を一定にしなくてはならない状況なのでよろしくお願いします。

  • クライアントPCでの使用ポート番号について

    NWのポート番号について調べていたところ 「ウェルノウンポート番号 (0~1023)はサーバのアプリケーションに割り当てられ、動的・プライベート ポート番号 (49152~65535)はサーバとのプロセスに応じクライアントのアプリケーションに動的に割り当てられます。」と記述してありました。 そこでUDP68番ポート(IPアドレス払い出しのクライアント側用)についてご教示ください。 68番ポートはウェルノウンポート番号にあたるのでサーバーのみが 使用し、クライアントPCは動的・プライベート ポート番号を使用すると認識しているのですが、ウェルノウンポート番号はクライアント側でも使用するのでしょうか?

  • ポート番号について

    ポート番号について 私は今通信ゲームを開発しているんですが 一方のPCがサーバーソフトを起動してそれに通信して サーバーとクライアントでやりたいなと思っているのですが ポート開放がわからない人でもできるようにしたいんですがここで質問です 必ず開いているポートはありまあせんか? なぜ1024番以下のポートは使用しないほうがいいんでしょうか? 80や110番のポートにソケットをたてそれを使って通信したらだめでしょうか だめならなぜでしょうか?

  • アプレットからサーバ側のプログラムを起動したいのですが…

    仕事でJavaを使うことになったのですが、プロジェクト員一同Java初心者で、必死にJavaを勉強していますが、以下のことで困っています。申し訳ありません。助けてください。 UNIXサーバ側の設定とかをいじるプログラムがあるのですが、それをアプレットにして、SEさんがリモートからでも操作出来るようにしろ、と言われました。 とりあえず、Javaアプレットからサーバ側(アプレットのクラスが置いてあるのと同じマシン)のCプログラムを起動し、その結果を受け取るようにしたいのですが、Java経験者に相談したら「アプレットにはセキュリティ上の問題があるのでCGIかServletを使わないと出来ない」と言われました。 では…とServletの勉強を初め、サーバー側にServletEngineをいれてみたのですが、 ServletはHTTPポートと違うポート(8000番とか)を開けてそこにアクセスしなくてはいけないようにみえます。それならクライアント側プログラムをアプレットにし、サーバ側プログラムとSocket通信で結び、サーバ側プログラムがCプログラムを起動、としたほうが楽そうですが、ひとつしかポートを開きたくないと言われたのです。 もしかして「アプレット+Servlet が アプレット+CGI相当」じゃなく「Servlet が アプレット+CGI相当」なのでServlet用のポートだけ開けとけばいいとかいうことでしょうか?  とか思っていたら、JNIでC言語のメソッドをJavaメソッド扱いするとかいう話も小耳に挟みました。それでできるのかしら? ・webポートだけを開いて ・サーバ側のCプログラムを起動してその結果を受け取る ・クライアントのマシンにあらかじめインストールしなくても、ブラウザからアクセスすると操作が対話的に出来るような ものを簡単に作ろうとしたら、一体何を勉強するべきなのでしょうか…。 Applet+CGI? Applet+Servlet? RMI? JNI…? 助けてください…(TT)

    • ベストアンサー
    • Java
  • プロキシサーバのポート番号について

    LAN内のPC1からプロキシサーバを経由して外部のPC2にアクセスする場合について疑問があります。 PC1とプロキシサーバ間の通信で使用するポート番号は、あらかじめ決めておけば良いのですが、プロキシサーバとPC2間の通信で使用するポート番号はどのように決まるのでしょうか? 1.PC1がプロキシサーバにアクセスした時のポート番号を使用する 2.PC1がプロキシサーバに使用するポート番号を通知している 3.プロキシサーバにあらかじめ設定しておいたポート番号を使用している 4.その他 申し訳ありませんが、ご存知の方、教えて頂けないでしょうか? お願い致します。

専門家に質問してみよう