※ ChatGPTを利用し、要約された質問です(原文:TCP/IP通信について)
TCP/IP通信のデータ送信で発生する問題とその解決方法
このQ&Aのポイント
TCP/IP通信において、データ送信時に発生する問題とその解決方法について説明します。
現在、TCP/IP通信のプログラミングを行っており、サーバ/クライアント別々に4byteのデータ送信を10msec毎に10秒間行っていますが、データが連なって送信される事象が発生しています。
OutputStreamではwrite後にflushを行っているので、送信用バッファが送信されるイメージであるが、実際には4byteで送信できていないように見えます。解決方法をご教授ください。
現在、以下のようにTCP/IP通信のプログラミングを行っており、
サーバ/クライアント別々に4byteのデータ送信を10msec毎に10秒間行っております。
現在、WimdowsVista-Windows7間で各々をサーバ/クライアントとして順に起動し、
相互に4byte送信しているハズが、倍の8byteや12byteとデータが連なって送信されている
事象が発生してます。
OutputStreamではwrite後にflushを行っているので、flush契機でメモリ上に蓄えられた
送信用バッファが送信されるイメージでおりますが、4byteで送信できていないように見えます。
上記について、解決方法をご存じであればご教授お願い致します。
<Server.java>
=====
public class Server {
public static ServerSocket ss = null;
public static Socket soc = null;
private static InputStream is = null;
private static OutputStream os = null;
public static void main(String[] args) {
try {
// サーバソケット生成
ss = new ServerSocket(5000);
soc = ss.accept();
is = soc.getInputStream();
os = soc.getOutputStream();
Thread rcvTh = new ServerRcvThread(is);
rcvTh.start();
Thread sndTh = new ServerSndThread(os);
sndTh.start();
// 10秒スリープ
try{
Thread.sleep(10000);
} catch ( Exception e){
e.printStackTrace();
}
// スレッド停止
rcvTh.stop();
sndTh.stop();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
is.close();
os.close();
soc.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class ServerSndThread extends Thread{
private static OutputStream ous = null;
ServerSndThread( OutputStream os ){
this.ous = os;
}
public void run(){
byte sndData[] = new byte[4];
sndData[0] = 0x01;
sndData[1] = 0x02;
sndData[2] = 0x03;
sndData[3] = 0x04;
try {
while(true){
// データ書込み
ous.write(sndData);
ous.flush();
System.out.println("データ送信");
// 0.01秒スリープ
try{
Thread.sleep(10);
} catch ( Exception e){
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerRcvThread extends Thread{
private static InputStream ins = null;
ServerRcvThread( InputStream os ){
this.ins = os;
}
public void run(){
byte rcvData[] = new byte[16];
int size = 0;
try {
while(true){
// データ読込み
size = ins.read(rcvData);
System.out.println("size:"+size+"byte");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
=====
<Client.java>
=====
public class Client {
private static Socket soc = null;
private static OutputStream os = null;
private static InputStream is = null;
public static void main(String[] args) {
try {
// ソケット生成
soc = new Socket("192.168.3.3", 5000);
is = soc.getInputStream();
os = soc.getOutputStream();
Thread rcvTh = new ClientRcvThread(is);
rcvTh.start();
Thread sndTh = new ClientSndThread(os);
sndTh.start();
// 10秒スリープ
try{
Thread.sleep(10000);
} catch ( Exception e){
e.printStackTrace();
}
// スレッド停止
rcvTh.stop();
sndTh.stop();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
is.close();
os.close();
soc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class ClientSndThread extends Thread{
private static OutputStream ous = null;
ClientSndThread( OutputStream os ){
this.ous = os;
}
public void run(){
byte sndData[] = new byte[4];
sndData[0] = 0x04;
sndData[1] = 0x03;
sndData[2] = 0x02;
sndData[3] = 0x01;
try {
while(true){
// データ書込み
ous.write(sndData);
ous.flush();
System.out.println("データ送信");
// 0.01秒スリープ
try{
Thread.sleep(10);
} catch ( Exception e){
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientRcvThread extends Thread{
private static InputStream ins = null;
ClientRcvThread( InputStream os ){
this.ins = os;
}
public void run(){
byte rcvData[] = new byte[16];
int size = 0;
try {
while(true){
// データ読込み
size = ins.read(rcvData);
System.out.println("size:"+size+"byte");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
=====
お礼
回答ありがとうございます! サイズ指定しても、8byte となってしまいますね…。 改良って他にも変更されたのでしょうか…? flushのAPI見ましたが、何もしないとは書かれていないように見えました。 ただ、実際のAPIソースコード見たら、ご指摘通り何にもしない、空APIに見えました。