javaのsocket通信で20KB以上の文字列を
javaのsocketについての質問です。サーバーとandroid端末で文字列のやりとりしています。
文字列は長いので、圧縮をかけ、android端末側で解凍を行っています。
そこで問題がおきました。文字データ量(20KB)が大きくなると、通信が完了せずに途中で止まってしまうのです。そこで文字列を分割(1KB毎)して送るなどを行い、しのいでおりましたが根本的の解決にはいたっていません。
InputStreamReader 、 BuffererdReader あたりを考えればいいと思うのですが、いまいち組み方がよくわからない状態です。 どなたか教えていただけないでしょうか?
=============================
サーバー(PC側ソースコード)DataCompression は文字列を送って圧縮をかける独自のクラスです。
public class DataExchange extends Thread{
/* android端末とデータのやり取りをする
*/
private boolean DEBUG_FLAG = true;
// private boolean DEBUG_FLAG = false;
private InputStream is;
private OutputStream os;
private String sendStr;
private String receiveStr;
public DataExchange(InputStream is, OutputStream os, String sendStr) {
this.is = is;
this.os = os;
this.sendStr = sendStr;
}
public void run() {
//送信データ圧縮
DataCompression dc = new DataCompression();
byte[] sendByte = dc.getDataCompression(sendStr);
//データ送信
try {
os.write(sendByte);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
if (DEBUG_FLAG) { System.out.println(os + " データ送信完了 = " + sendStr); }
//データ受け取り
byte[] buffer = new byte[1024];
try {
int size = 0;
while (size <= 0) {
size = is.read(buffer);
}
receiveStr = new String(buffer, 0,size, "UTF8");
} catch (IOException e) {
e.printStackTrace();
}
if (DEBUG_FLAG) { System.out.println(is + " データ受信完了 = " + receiveStr); }
}
public String getReceiveStr() {
return receiveStr;
}
}
=========================================
android端末側ソースコード
public class DataExchange extends Thread{
/* android端末とデータのやり取りをする
*/
private InputStream is;
private OutputStream os;
private String sendStr;
private String receiveStr;
public DataExchange(InputStream is, OutputStream os, String sendStr) {
this.is = is;
this.os = os;
this.sendStr = sendStr;
}
public void run() {
//データ受け取り
byte[] buffer = new byte[4096];
try {
int size = 0;
while (size <= 0) {
size = is.read(buffer);
}
receiveStr = new String(buffer, 0,size, "UTF8");
} catch (IOException e) {
e.printStackTrace();
}
/* 解凍 */
Inflater decompresser = new Inflater();
decompresser.setInput(buffer);
int count;
ByteArrayOutputStream decompos = new ByteArrayOutputStream();
while (!decompresser.finished()) {
try {
count = decompresser.inflate(buffer);
decompos.write(buffer, 0, count);
} catch (DataFormatException e) {
e.printStackTrace();
}
}
receiveStr = decompos.toString();
System.out.println("データ受信完了 = " + receiveStr);
//データ送信
try {
byte[] sendByte = sendStr.getBytes("UTF8");
os.write(sendByte);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("データ送信完了 = " + sendStr);
}
public String getReceiveStr() {
return receiveStr;
}
}
お礼
他にも方法あるんですね。当たり前ですが。 自分の勉強不足を感じています。 ありがとうございました。