※ ChatGPTを利用し、要約された質問です(原文:javaのsocket通信で20KB以上の文字列を)
javaのsocket通信で20KB以上の文字列を
このQ&Aのポイント
javaのsocket通信で20KB以上の文字列を送信する際に通信が途中で止まってしまう問題が発生しています。
文字列を分割して送るなどの対策は行っていますが、根本的な解決には至っていません。
InputStreamReaderとBufferedReaderを使用して問題を解決する方法について教えてください。
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;
}
}
お礼
ありがとうございます、こちらのコードを参考にしてもう一度組んでみたいと思います。