以前にはデータ交換用と接続チェック用の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でもいけると思います。
また時間があれば検証してみます。
これは面白いものが作れそうな予感。
もしこの記事を見た方で、「この人を我社に!」と思えた方がいらっしゃいましたら拾ってください!(切実)