むかし、Javaの入出力:Socket通信(サーバー側 その3:複数クライアント対応プログラム)。 で、スレッドの話を書き、1通りのほうしか説明しなかったので、もう1つのほうも説明しておきます。
■スレッドの方法
Javaでスレッド処理するには、上記のところにかいたように、
・Threadクラスを継承するものと
・Runnableインターフェースを実装するもの
があります。
Threadクラスを実装するものについては、上記のところのとおりです。
Runnableインターフェースを実装する方法について、今回は書きます。
作り方は、ここを参照してください。
■ソース
やることは、
1.クラスにimplements Runnableとする
2.スレッドの発生は、
test test1 = new test();
Thread tr1 = new Thread(test1);
tr1.start();
のように、1のクラスをnewで生成し、それをThredクラスのコンストラクタの引数として
Threadクラスを生成し、生成したものをstartさせます。
3.それ以外のrunメソッドの中身は、Threadクラスと同じです
→今回はコピーしてきました。
その結果、できたソースは以下のとおり
import java.io.*; import java.net.*; public class test implements Runnable { Socket socket = null; /* * メイン処理(呼び出し元) */ public static void main(String[] args) { try { // サーバーを生成 ServerSocket serverSocket = new ServerSocket(5050); while(true) { // ソケットを生成 Socket socket = serverSocket.accept(); // スレッド生成 test test1 = new test(); test1.setSocket(socket); Thread tr1 = new Thread(test1); tr1.start(); } } catch(Exception e) { e.printStackTrace(); } } public void setSocket(Socket socket) { this.socket = socket; } /* * 処理部分 */ public void run() { if ( socket == null ) { return; } try { //-------------------- //受信する //-------------------- InputStream is1 =socket.getInputStream(); InputStreamReader ir1 = new InputStreamReader(is1); BufferedReader br1 = new BufferedReader(ir1); // よみこめるまでまってる while(is1.available() == 0); // 1行読み込む int c; String line = ""; while((c = br1.read()) != '¥n' ) { line = line + (char)c; } //-------------------- //ファイル名のところを取り出す //-------------------- String[] cell = line.split(" "); // 省略時、ファイル名を付ける if ( cell[1].charAt(cell[1].length()-1) == '/' ) { cell[1] = cell[1] + "index.htm"; } // ファイル名を作成 String fname = ""; fname = cell[1].substring(1); System.out.println(fname); //-------------------- //ファイルを取得 //-------------------- File f = new File(fname); FileInputStream fi = new FileInputStream(f); byte[] data = new byte[(int)f.length()]; fi.read(data); fi.close(); String dataStr = new String(data); //-------------------- //送信する //-------------------- OutputStreamWriter ow1 = new OutputStreamWriter(socket.getOutputStream()); BufferedWriter bw1 = new BufferedWriter(ow1); bw1.write(dataStr); bw1.flush(); // クローズ bw1.close(); ow1.close(); br1.close(); ir1.close(); } catch(Exception e) { e.printStackTrace(); } } } |
(上記< > ¥は、本当は半角です)
これを起動して、
ブラウザで、
http://127.0.0.1:5050/test.java
とか指定すると、起動したところのローカルにある、
test.javaファイルの内容をブラウザに返します。