アプリ版:「スタンプのみでお礼する」機能のリリースについて

Socketの使用方法について

サーバ側クラスA
クライアント側クラスB

とあり、Aは常駐しておりBから接続が合った場合に処理を行い、
処理後には待機状態に再び戻ります。

上記の場合に
Aのクラスは以下のように作成しましたが、★の部分でCloseではなく、このままこのソケットを使用して待機したいです。
(ほぼ同時刻に複数のアクセスがあるため、資源の事を考えて使いまわしたいです。)
どのような手段があるのかご指導お願い致します。
又、そもそもソケットに関しての理解が足りないとも思いますので、参考サイトを教えていただけると幸いです。

クラスA
ServerSocket svsock = new ServerSocket(port);
while (true) {
Socket socket = svsock.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new PrintWriter(socket.getOutputStream(), true));

// 処理結果を受信
String line;
if ((line = in.readLine()) != null) {
System.out.println("受け取ったメッセージ : " + line);
out.write("サーバで表示。");
out.newLine();
out.flush();
}
socket.close(); // ★
}

A 回答 (1件)

>Closeではなく、このままこのソケットを使用して待機したいです。


何か勘違いしてますね。クライアントからの接続を受け付けるのは
svsockであって、 socketではありません。使用済みのsocketを
残しても再利用できませんし、資源の無駄になるだけです。
例えばFTPサーバではポート番号=21でbindしたソケットでaccept
します。しかし、acceptの戻り値で受け取ったソケットはポートが
21ではありません。当たり前ですが、同じマシン内でポート番号が
同じソケットが複数存在できないからです。また、この機能によって、
同じクライアント-サーバ間で複数のFTP接続ができるのです。

>同時刻に複数のアクセスがある
サーバ側プログラムでは当然の話で、マルチスレッドで対応します。
掲題のプログラムのようにマルチスレッドでない処理の方が不自然
です。
acceptで待機状態になり、クライアントのconnectを受け付けると
次のステップへ進みます。ここで、Threadを継承したクラスを使って、
新スレッドを立ち上げ、以降の処理は新しいスレッドで処理します。
メインスレッドは新スレッドを起動したら、再び、acceptに戻ります。
例え、僅かな処理でもこうすべきです。
ソケットは処理クラスのコンストラクタで渡せば良いでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!