質問編集履歴

1

ソースコード掲載

2017/07/05 15:12

投稿

DJ1984
DJ1984

スコア19

title CHANGED
File without changes
body CHANGED
@@ -1,2 +1,102 @@
1
1
  今AndroidとPCとをBluetoothで接続しファイルの送受信を行うプログラムを書いています。
2
- しかし、送信するデータが大きすぎるとうまく受信できないようです。質問なのですがBluetoothでは一度にデータを送受信できる限界値があるのでしょうか?
2
+ しかし、送信するデータが大きすぎるとうまく受信できないようです。質問なのですがBluetoothでは一度にデータを送受信できる限界値があるのでしょうか?
3
+
4
+ 送信側(PC)プログラム
5
+ ```Java
6
+ //選択したファイルの情報をまとめる
7
+ StringBuilder builder = new StringBuilder();
8
+ for (File file : fileList) {
9
+ builder.append(file.getName());
10
+ builder.append(FILE_SEPARATOR);
11
+ builder.append(file.length());
12
+ builder.append(DATA_SEPARATOR);
13
+ }
14
+
15
+ sessionTools.getController().appendToConsole("Send file info:" + builder.toString());
16
+
17
+ String encodedMessage = URLEncoder.encode(builder.toString(), "UTF-8");
18
+ BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(sessionTools.getOutputStream()));
19
+ bufferedWriter.write(encodedMessage);
20
+ bufferedWriter.newLine();
21
+ bufferedWriter.flush();
22
+
23
+ BufferedOutputStream outputStream = new BufferedOutputStream(sessionTools.getOutputStream());
24
+ for (File file : fileList) {
25
+ sessionTools.getController().initProgressBar(String.format("%sを送信", file.getName()), 0);
26
+
27
+ byte[] data = readFile(file);
28
+ int sum = data.length;
29
+ int divide = 1024;
30
+ int divisionCount = sum / divide;
31
+ int remainder = sum % divide;
32
+
33
+ if (divisionCount < 1) {
34
+ outputStream.write(data);
35
+ outputStream.flush();
36
+ } else {
37
+ for (int index = 0; index < divisionCount; index++) {
38
+ outputStream.write(data, index * divide, divide);
39
+ outputStream.flush();
40
+
41
+ double percentage = (double) (index * divide) / sum;
42
+ sessionTools.getController().updateProgress(String.format("%sを送信中 %d %%", file.getName(), (int) (percentage * 100)), percentage);
43
+ }
44
+
45
+ if (remainder > 0) {
46
+ outputStream.write(data, sum - remainder, remainder);
47
+ outputStream.flush();
48
+ }
49
+
50
+ sessionTools.getController().finishedProgress(String.format("%s送信完了", file.getName()));
51
+ sessionTools.getController().appendToConsole("Send " + file.getName());
52
+ }
53
+ }
54
+ ```
55
+
56
+ 受信側(Android)プログラム
57
+ ```Java
58
+ //ファイル情報をもとにデータを受信
59
+
60
+ //ファイル情報を取得
61
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(sessionTools.getInputStream()));
62
+ String msg = bufferedReader.readLine();
63
+ msg = URLDecoder.decode(msg, "UTF-8");
64
+
65
+ if(msg.equals(CANCEL_MESSAGE)){
66
+ exception = new Exception("サーバがファイル送信コマンドをキャンセルしました");
67
+ return -1;
68
+ }
69
+
70
+ //ファイル情報を解析してMapに入れる
71
+ String[] fileDatas = msg.split(DATA_SEPARATOR);
72
+ for(String fileData : fileDatas){
73
+ String fileName = fileData.split(FILE_SEPARATOR)[0];
74
+ int size = Integer.parseInt(fileData.split(FILE_SEPARATOR)[1]);
75
+
76
+ fileMap.put(fileName, size);
77
+ }
78
+ byte[] dataBuffer = new byte[BUFFER_SIZE];
79
+ BufferedInputStream bufferedInputStream = new BufferedInputStream(sessionTools.getInputStream());
80
+ for(String fileName: fileMap.keySet()){
81
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
82
+ int dataSize = fileMap.get(fileName);
83
+ int current = 0;
84
+ while ((len = bufferedInputStream.read(dataBuffer)) != -1) {
85
+ if (dataSize - current < BUFFER_SIZE) {
86
+ byte[] tempBuffer = new byte[dataSize - current];
87
+ len = bufferedInputStream.read(tempBuffer);
88
+ byteArrayOutputStream.write(tempBuffer, 0, len);
89
+ break;
90
+ } else {
91
+ byteArrayOutputStream.write(dataBuffer, 0, len);
92
+ current += len;
93
+ }
94
+ double percentage = ((double)current / dataSize) * 100;
95
+ publishProgress((int)percentage);
96
+ }
97
+ byteArrayOutputStream.flush();
98
+ saveFile(fileName, byteArrayOutputStream.toByteArray());
99
+
100
+ publishProgress(100);
101
+ }
102
+ ```