マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

適当にServerSocketを使ってみる

バイトでAndroidを使ってるものの、使ってるライブラリが限られているのと、フレームワーク使ってる関係で、Androidの開発の仕方をだいぶ忘れてしまった気がする。そしてJavaも...リハビリもこめてちょっとプログラムを書いてみた。今回はServerSocketを使ってAndroid端末をサーバにしてみた。クライアントからは何も受け取らず、一方的に送信して終了。クライアントもJavaで書いてあるが、動作確認だけできればいいと思って書いたので、いい加減なプログラムなので注意。パーミッションandroid.permission.INTERNETを加えることも忘れずに

まずはサーバプログラムから

package net.d_kami;

import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class ServerTestActivity extends Activity implements Runnable{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        TextView view = new TextView(this);
        
        try{
            String ip = ServerTestActivity.getIPAddress();
            view.setText(ip);
            
            Thread thread = new Thread(this);
            thread.start();
        }catch(IOException e){
            view.setText("IPアドレスの取得に失敗しました");
        }
        
        setContentView(view);
    }
    
    public void run(){
        ServerSocket server = null;
        Socket socket = null;
        BufferedWriter writer = null;
        
        try{
            server = new ServerSocket(45678);
            
            while(true){
                socket = server.accept();
                writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                writer.write("Hello World!\r\n");

                writer.close();
                socket.close();
            }
        }catch(IOException e){
            try{
                if(writer != null){
                    writer.close();
                }
                
                if(socket != null){
                    socket.close();
                }
                
                if(server != null){
                    server.close();
                }
            }catch(IOException ex){
                Log.e(ex.getClass().getName(), ex.getMessage());
            }
            
            Log.e(e.getClass().getName(), e.getMessage());
        }
    }
    
    private static String getIPAddress() throws IOException{
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            
        while(interfaces.hasMoreElements()){
            NetworkInterface network = interfaces.nextElement();
            Enumeration<InetAddress> addresses = network.getInetAddresses();
                
            while(addresses.hasMoreElements()){
                String address = addresses.nextElement().getHostAddress();
                    
                //127.0.0.1と0.0.0.0以外のアドレスが見つかったらそれを返す
                if(!"127.0.0.1".equals(address) && !"0.0.0.0".equals(address)){
                    return address;
                }
            }
        }
            
        return "127.0.0.1";
    }
}

あと超手抜きのクライアントプログラム。使い方は

java Test Android端末のIPアドレス

Android端末のIPアドレスはサーバプログラムで取得してテキストビューで表示している。

import java.net.Socket;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Test{
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket(args[0], 45678);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
        System.out.println(br.readLine());
        br.close();
        socket.close();
    }
}