• 締切済み

accept している ServerSocket

ssr-y6の回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.2

 以下が、サーバを別スレッドで実行させ、それをメインスレッドで監視/制御する方法の一例です。  このサンプルは、接続中にIEなどで"http://localhost:12354/"にアクセスすれば接続され、 10秒たっても接続がない場合は、強制終了させます。 import java.net.*; class serverthread extends Thread { private ServerSocket Server; private Socket Client; private boolean ConnectFlag; public serverthread() throws Exception { super(); Server = new ServerSocket(12345); ConnectFlag = false; }; public void ConnectStart() { start(); }; public boolean CheckConnected() { return(ConnectFlag); }; public void BreakConnecting() { try { Server.close(); } catch(Exception ex) { System.out.println("<close>" + ex.toString()); }; }; public String GetConnectionData() { if (!ConnectFlag) return("NotConnected"); return(Client.getInetAddress().toString() + " : " + Integer.toString(Client.getPort())); }; public void run() { try { Client = Server.accept(); ConnectFlag = true; } catch(Exception ex) { System.out.println("<run>" + ex.toString()); }; }; } public class serverto { private static final int TimeoutTime = 10; public static void main(String args[]) { int Int1; try { serverthread ServerThread = new serverthread(); ServerThread.ConnectStart(); for (Int1 = 0; Int1 < TimeoutTime; Int1 ++) { if (ServerThread.CheckConnected()) break; System.out.println("Connecting.." + Int1); try { Thread.sleep(1000); } catch(Exception e) {}; }; if (Int1 == TimeoutTime) ServerThread.BreakConnecting(); System.out.println(ServerThread.GetConnectionData()); ServerThread.join(); } catch(Exception ex) { System.out.println("<main>" + ex.toString()); }; }; }

関連するQ&A

  • Socket プログラミングについて

    先日の質問ではありがとうございました。 今回はソースコードについてですが もしよろしければアドバイスお願いします。 Socket 制御を行うアプリを作成しています。 ・クライアントアプリ ・サーバアプリ の2つから構成していまして同PC上で動作させます。 クライアントから localhost 経由でサーバアプリに接続。 サーバアプリは ServerSocket を生成して accept しています。 サーバアプリで accept により Socket を生成すると その Socket を Thread に引き渡して適宜処理を行います。 その後、 再び別クライアントからの接続を待つために サーバアプリで accept したいのですが そのまま accept を呼び出しても そこで待機せずに新しい Socket を生成しています。 別クライアントからの接続を待機するにはどうしたらいいのでしょうか? ご教授お願いします。

    • ベストアンサー
    • Java
  • JAVAのソケット通信の接続数について

    JAVAのソケット通信の接続数について ServerSocket server= new ServerSocket( port ); server.setSoTimeout( 4000 ); Socket socket = server.accept();//クライアントからの接続をまつ 以上のコードを使っていますが、クライアントからの接続数を調べる方法はないでしょうか?

    • ベストアンサー
    • Java
  • 携帯のjavaでthreadを強制中断するには

    携帯のjavaでthreadを強制中断するには javaの thread には stop() で強制的に処理を止めることができると思いますが、携帯(DoCoMo)のjava では stop() が使えないのでしょうか? 携帯で思考をしている thread が一定以上時間がかかってしまったなら、諦めて中断させたいのですが。 今は、stop()が使えないので、中断フラグを使って中断させていますが、複雑な思考のなかで、いろいろな所に中断フラグを監視しなければならず、たいへん面倒です。 なにかうまい方法をご存知ならご教授ください。

    • ベストアンサー
    • Java
  • ソケット通信で

    ServerSocketのaccept()で接続を受け付けるときに、 指定したIPアドレスからの接続を拒否することはできますか? このメソッドの説明に 新しいソケット s が作成され、セキュリティマネージャが存在する場合、セキュリティマネージャの checkAccept メソッドが、引数として s.getInetAddress().getHostAddress() および s.getPort() を指定して呼び出され、この操作の実行が許可されていることを確認します。と あるんですがどこでアクセス拒否を設定したらいいのかわかりません。

  • 相手のIPアドレスを知る手段

    C言語で、サーバーソケット(accept)でコネクションを確立した後、 接続された相手のIPアドレスを知る手段はありますでしょうか。 Javaでは、java.net.ServerSocketクラスの、getInetAddressという メソッドを利用して知ることができるのですが、C言語ではどうして いいのか分かりません。ご存知の方ご教授よろしくお願いします。

  • 時間を計測する

    お世話になります。 DBも用いた処理を行っているのですが 条件によっては検索時間が長すぎるため途中でやめたいと思っています。 SQLを発行してから1分間応答がなかったら強制的に処理を中断するということを やりたいのですが スレッドを使わないと無理でしょうか? スレッドを使わないで行う方法がありましたらアドバイスお願いします。 DBのコネクションは3分程度とっていますのでconnectionがきれたときのexceptionをとるという方法なNGです。

    • ベストアンサー
    • Java
  • C#でスレッド実行中のイベントについて

    メインフォームの「処理開始ボタン」をクリックすると別スレッドが起動して、そのスレッド中で重たい処理をさせ、処理中に「中断ボタン」をクリックすると中断してアイドル状態に戻る様なプログラムについてですが、 先ず、Invokeを使わずに直接スレッドを起動すると期待通りの動作となり、Thread.Sleep()中でもボタンクリックのイベントが発生します。 しかし、Invokeとデリゲートを使ったスレッドを起動させるとスレッドの処理が終了するまでイベントが発生せず、行ったきり状態になってしまいます。 処理ループ内にAplication.DoEvent()を入れるとイベントが発生する様になりますが、Thread.Sleep()中はフリーズ状態となります。 Invokeを使ったスレッドでも、Invokeを使わない場合と同じ動作をさせる方法があれば教えて頂けないでしょうか。 どうぞ宜しくお願いします。

  • Linuxのsocket接続でacceptできない

    Ubuntu 10.10 + gcc4.4 + eclipse で C言語プログラミングをしています。 ソケットを使用したプログラムを試していたのですが、思うように動作しません。 作成したプログラムは以下のようなものです。 ・ローカルマシン上で、サーバプログラム、クライアントプログラムを用意する ・サーバ側はソケット作成後、クライアントが接続するまで listen する ・クライアントはサーバに接続したら、接続した旨を表示する という初歩的なものです。 問題は、サーバ側が accept したときに戻り値 -1 を返却して終了してしまうことです。 以下が作成したソースです。 ■■■▼ サーバ側ここから ▼■■■ #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_un srv; socklen_t socklen; /* ソケット名をコマンド入力で受け取る */ if(argc != 2) { puts("USAGE: mksock <filename>"); exit(EXIT_FAILURE); } /* ソケット作成 */ if((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){ exit(EXIT_FAILURE); } /* srv 初期化 */ memset(&srv, 0, sizeof(srv)); srv.sun_family = AF_UNIX; strncpy(srv.sun_path, argv[1], sizeof(srv.sun_path)); /* バインド */ if((bind(sockfd, (struct sockaddr *)&srv, SUN_LEN(&srv))) < 0){ exit(EXIT_FAILURE); } /* クライアントからの接続待ち */ if((listen(sockfd, 5)) < 0) { exit(EXIT_FAILURE); } printf("socket available: %s, sockfd=%d\n", srv.sun_path, sockfd); /* 接続がある限りくりかえす */ int sockResult; while(1) { sockResult = accept(sockfd, (struct sockaddr *)&srv, &socklen); printf("sockResult = %d, sun_path=%s\n", sockResult, srv.sun_path); if (sockResult < 0) break; puts("new connection granted"); } puts("mksock end"); exit(EXIT_SUCCESS); } ■■■▲ サーバ側ここまで ▲■■■ ●●●▼ クライアント側ここから ▼●●● #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int sockfd; struct sockaddr_un cli; socklen_t socklen; /* ソケット名をコマンド入力で受け取る */ if(argc != 2) { puts("USAGE: sockconn <filename>"); exit(EXIT_FAILURE); } /* ソケット作成 */ if((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){ exit(EXIT_FAILURE); } /* クライアント設定 */ memset(&cli, 0, sizeof(cli)); cli.sun_family = AF_UNIX; strncpy(cli.sun_path, argv[1], sizeof(cli.sun_path)); /* サーバへ接続 */ socklen = SUN_LEN(&cli); if(connect(sockfd, (struct sockaddr *)&cli, socklen)) { exit(EXIT_FAILURE); } printf("connected to socket %s\n", cli.sun_path); exit(EXIT_SUCCESS); } ●●●▲ クライアント側ここまで ▲●●● これから作成されたバイナリを同一フォルダに置いて、作成ユーザで、カレントディレクトリで実行しました。 以下が実行時の入出力です(カッコ内は実行順序)。 ■▼ サーバ側ここから ▼■ $ ./mksock jjj1…(1) $ socket available: jjj1, sockfd=3 $ sockResult = -1, sun_path=jjj1 $ mksock end ■▲ サーバ側ここから ▲■ ●▼ クライアント側ここから ▼● $ ./sockconn jjj1…(2) $ connected to socket jjj1 ●▲ クライアント側ここから ▲● 上記のように、サーバ側が accept 時に -1 を返却しています。 パーミッションについては以下になっています。 srwxr-xr-x 1 hoge hoge 0 2011-09-04 21:36 jjj1 -rwxr--r-- 1 hoge hoge 86870 2011-09-04 21:36 mksock -rwxr--r-- 1 hoge hoge 86775 2011-09-04 21:36 sockconn パーミッションを見る限り、ソケットファイルにはアクセスできているかと。 おそらく環境周りではないかと思いますが、考えつきません。 linux プログラミングに詳しいかた、よろしくお願いいたします。

  • 5chワッチョイIP表示について

    5chのワッチョイでIPを表示する設定になっているかどうかはどうすれば わかりますか? ワッチョイとは、5ch(旧2ch)やしたらば掲示板に於いて 特定の条件を満たしたレスやスレッドで強制的に表示される 妙なニックネームの1つ。 また、そこから転じて、その妙なニックネーム等を強制的に表示させる コマンドを指す。コマンドを使う行為の事を「ワッチョイを入れる」、 「ワッチョイを導入する」と言われたり、コマンドが 使われているスレッドに対して「このスレはワッチョイが入っている」と 言われる事も。 https://dic.nicovideo.jp/a/%E3%83%AF%E3%83%83%E3%83%81%E3%83%A7%E3%82%A4

  • 通信の中断 doja 3.0

    HttpConnection のconnectでサーバと通信する際に、なかなかつながらないときはユーザー操作で通信をキャンセルできるようにもくろんでいます。 浮かぶ方法としては、 #1 通信用のクラスでRunnableを実装 #2 通信時にこのスレッドを生成 #3 中止のキーイベントで、スレッドを強制終了 だったのですが、stop(), suspend() はJ2SEでも推奨されていないせいか、コンパイルでシンボルエラーをくらってしまいます。 他のアプリで通信中断をしているアプリも見かけたことがあるのですが、あれはどうやっているんでしょうか。 アドバイスをお願いします。

    • ベストアンサー
    • Java