目次

[Android開発]Wi-Fi Directでファイル送信をしよう

2018年11月23日

今回紹介するのは、Wi-Fi Directで繋がった二台の端末でファイルの送受信を行う
アプリケーションについての紹介だ。

ちなみに、ソースコードをブログに貼り付ける方法は、以下の記事で紹介しているので
参考にしてほしい。

今回は、ボタンを押した際に、サーバ構築及びファイル送信を行っている.

ポートは8001を開放している,クライアントが接続するアドレスは192.168.49.1にした.

これはWi-Fi Directで繋がった場合固定なのかな?ってかんじで実は自分も微妙なところがある.

ちなみに参考にしたサイトは
The Quick Gold Fox
を参考にした。
はっきし言ってAndroidように少し書き換えただけである…

では早速手順を

・ファイルを受け取るサーバー側の起動は

[java]
SocketServer ss =new SocketServer();
ss.ServerStart();
[/java]

ファイルを送るクライアント側は

[java]
SocketClient sc =new SocketClient();
sc.ClientStart();
[/java]

にてクライアント側の送信処理メソッドを呼び出す.
そして実際ファイルを受け取るサーバーは

[java]
public class SocketServer {
final static int PORT = 8001; // 待受ポート番号
public void ServerStart() {
Log.d("サーバ", "スタート");
(new Thread(new Runnable() {
@Overridez
public void run() {
String outputFilepath = path02; // 受信したファイルの保存先
byte[] buffer = new byte[512]; // ファイル受信時のバッファ
try {
// ソケットの準備
ServerSocket serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
Log.d("受け取り","かいし?");
// ストリームの準備
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = new FileOutputStream(outputFilepath);
// ファイルをストリームで受信
int fileLength;
while ((fileLength = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, fileLength);
}
// 終了処理
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
handler01.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"ファイル受け取り完了",Toast.LENGTH_SHORT).show();
}
});
SocketServer ss =new SocketServer();
ss.ServerStart();
} catch (IOException e) {
e.printStackTrace();
}
}
})).start();
}
}
[/java]

クライアント側は

[java]
public class SocketClient{
final static String HOST = "192.168.49.1"; // 接続先アドレス
final static int PORT = 8001; // 接続先ポート番号
public void ClientStart(){
(new Thread(new Runnable() {
@Override
public void run() {
String filepath = path; // 送信するファイルのパス
File file = new File(filepath); // 送信するファイルのオブジェクト
byte[] buffer = new byte[512]; // ファイル送信時のバッファ
Log.d("クライアント","スタート");
try {
// ソケットの準備
Socket socket = new Socket(HOST, PORT);
// ストリームの準備
InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = socket.getOutputStream();
// ファイルをストリームで送信
int fileLength;
while ((fileLength = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, fileLength);
}
// 終了処理
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
Log.d("ファイル送信","成功");
} catch (IOException e) {
e.printStackTrace();
Log.d("ファイル送信","失敗" +e.toString());
}
}
})).start();
}
}
[/java]

ポートとファイルパスは、各自自分の送るファイルのパスと受け取る側のパスを指定してください。
これを書けばとりあえずWi-Fi Directで、ファイル送信できるようになると思う.

ちなみにAndroidのOSバージョン6以上は、ファイルを読み込む際
パーミッションが変更されてるので、
少し親切なRuntime Permission対応
を参考にしてみればいいと思います。

関連記事