カテゴリー
未分類

JavaのSocketで切断を検知(2)

以前にはデータ交換用と接続チェック用の2つのソケットをつないで、接続チェック用のソケットを使って相手が一定時間以内にデータを送ってきているかどうかで接続をチェックしていた。

あまりに無駄である。

 

もっと素直に簡単な方法があった。

Socket s = new ServerSocket(portNum).accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
try{
    while(true)System.out.println(in.readLine());
}catch(IOException e){
    System.out.println(“Disconnected.”);
}

これだけ。どうやら切断されたらIOExceptionに投げられるらしい。まぁ当たり前といえば当たり前なのかな?

というのを踏まえて、複数人が同時にアクセス出来るメッセージ交換システムを作ってみた。

 

以下ソースコード

SocketServer.java

import java.io.*;
import java.util.*;
import java.net.*;

class SocketServer{
    private static ArrayList<ServerSocketThread> socketThreads = new ArrayList<ServerSocketThread>();
    public static void main(String[] args)throws IOException{
        while(true){
            ServerSocket sv = new ServerSocket(1024);
            ServerSocketThread sst = new ServerSocketThread(sv.accept());
            socketThreads.add(sst);
            sst.start();
            sv.close();
            System.out.println(“Connected!”);
            System.out.println(“now : “+socketThreads.size()+”n”);
            for(int i=0;i<socketThreads.size();i++){
                try{socketThreads.get(i).send(“Connected.”);}catch(IOException ex){}
            }
        }
    }
    public static class ServerSocketThread extends Thread{
        private Socket s;
        private BufferedReader in;
        private PrintWriter out;
        ServerSocketThread(Socket s)throws IOException{
            this.s = s;
            in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            out = new PrintWriter(s.getOutputStream());
        }
        public void run(){
            try{
                while(true){
                    String str = in.readLine();
                    for(int i=0;i<socketThreads.size();i++){
                        socketThreads.get(i).send(str);
                    }
                }
            }catch(IOException e){
                socketThreads.remove(this);
                System.out.println(“Disconnected.”);
                System.out.println(“now : “+socketThreads.size()+”n”);
                for(int i=0;i<socketThreads.size();i++){
                    try{socketThreads.get(i).send(“Disconnected.”);}catch(IOException ex){}
                }
            }
        }
        public void send(String data)throws IOException{
            out.println(data);
            out.flush();
        }
    }
}

 

SocketClient.java

import java.io.*;
import java.util.*;
import java.net.*;

class SocketClient{
    private static Socket s;
    public static void main(String[] args)throws IOException{
        Scanner input = new Scanner(System.in);
        s = new Socket(“localhost”,1024);
        PrintWriter out = new PrintWriter(s.getOutputStream());
        new ClientSocketThread().start();
        while(true){
            out.println(input.nextLine());
            out.flush();
        }
    }
    public static class ClientSocketThread extends Thread{
        private BufferedReader in;
        ClientSocketThread()throws IOException{
            in =  new BufferedReader(new InputStreamReader(s.getInputStream()));
        }
        public void run(){
            try{
                while(true){
                    System.out.println(in.readLine());
                }
            }catch(IOException e){}
        }
    }
}

 

恐らくJavaプログラム間だけではなく、Java←→Flashでもいけると思います。

また時間があれば検証してみます。

これは面白いものが作れそうな予感。

 

もしこの記事を見た方で、「この人を我社に!」と思えた方がいらっしゃいましたら拾ってください!(切実)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です