2011年2月4日金曜日

【java】ポートを使った他端末との通信

サーバーとローカルでのソケット間通信の処理を書く際に、いつもWriterとReaderの選択をミスって時間かかってしまうので、メモしとく。

【送る側】
(MylogSend)
----------------------------------------------------------------
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.*;
public class MylogSend {
private static final String host = "000.000.000.000";
public static void main(String[] argv) throws Exception {
MylogSend.write("日本語もOK");
}
public static void write(String msg) {

        System.out.println(host + "に接続します。" );
        PrintWriter out = null;
        try {
            Socket socket = new Socket(host,514);
         // 出力ストリームを取得
            out = new PrintWriter(socket.getOutputStream(), true);
            out.println(msg);
            out.flush();

        } catch (UnknownHostException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        finally{
            if (out != null) {
                out.close();                
            }
        }
}
}
----------------------------------------------------------------

【受信側】
※コンソール落とすまでずっと受信し続ける
(Startup.class)
----------------------------------------------------------------
public class Startup {
    static receive_data rcdata;
    /**
     * @param args
     */
    public static void main(String[] args) {
        rcdata = new receive_data();
        
        if (args.length > 1) {
            rcdata.intPort = Integer.parseInt(args[0]);
        }
        rcdata.start();    
    }
}
----------------------------------------------------------------
(receive_data.class)
----------------------------------------------------------------
import java.io.*;
import java.net.*;
import java.sql.Time;
import java.util.Date;
public class receive_data extends Thread {
    Date time = new Date();
    public int intPort = 514;
    public String host =  "000.000.000.000";
    public receive_data() {
    }
    ServerSocket svsocket;
    public void receive() throws Throwable{
        InputStreamReader in = null;
        try {
            Socket socket = svsocket.accept();
            InputStream ois = socket.getInputStream();
            in = new InputStreamReader(ois, "SJIS");
            BufferedReader bf = new BufferedReader(in);
            time.setTime(System.currentTimeMillis());
            System.out.println(time.toString());
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        finally{
            in.close();
        }
    }
    @Override
    public void run() {
        try {
            svsocket = new ServerSocket(intPort);
            System.out.println("クライアントからの接続をポート"+ intPort + "で待ちます。");
            while (this != null) {
                time.setTime(System.currentTimeMillis());
                System.out.print(time.toString() + "~");
                receive();
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (Throwable e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
}
----------------------------------------------------------------

0 件のコメント:

コメントを投稿