Iシリアル通信(RXTXCommライブラリ)を使用してファイルを送受信するサーバー/クライアントJAVAアプリケーションを作成しました。
私のプロジェクトのために、送信の途中でリンクが物理的に切断される可能性があるので、ネットワークが再確立された後、送信を再開するスライディングウィンドウと接続リセットコードを実装しました。シリアル接続のリセットビットが間違っています
問題は、接続が切断されて再確立された後にデータを受信し、あるが
Serverコード「レシーバー」破損している:
bytesRead = in.read(mybytearray, 0, mybytearray.length);
System.out.println("R\t Bytes read\t" + bytesRead);
current = bytesRead;
System.out.println("R\t\t FIRST Last byte recieved \t" + current);
outR.writeLong((current + 1));
outR.flush();
System.out.println("R\t\tSending ACK");
while (true) {
do {
bytesRead = in.read(mybytearray, current, (mybytearray.length - current));
System.out.println("R\t Bytes read\t" + bytesRead);
if (bytesRead >= 0) current += bytesRead;
System.out.println("R\t\tLast byte recieved \t" + current);
//ACK = Integer.toString((current+1));
outR.writeLong((current + 1));
outR.flush();
System.out.println("R\t\tSending ACK");
} while (bytesRead > 0);
//in.close();
if ((mybytearray[current - 1] & 0xff) != 0b01000101) {
int timer = 0;
boolean loop = true;
while (loop) {
timer++;
Thread.sleep(1000);
if (timer > 5) {
System.out.println("R\t\t Connection Timeout");
timer = 0;
current = 0;
break;
}
}
} else {
break;
}
}
bos.write(mybytearray, 0, current - 1);
bos.flush();
System.out.println("R\t\tfinished recieving");
bos.close();
、これはクライアントの「送信者」
ですpublic static class InReciever implements Runnable {
DataInputStream inS;
public InReciever(DataInputStream in) {
inS = in;
}
@Override
public void run() {
try {
//int timer=0;
while (true) {
long ack = 0;
if (brek)
break;
if ((ack = inS.readLong()) > 0) {
firstACK = false;
windowStart = ack;
System.out.println("S\t\tRecieving ack");
System.out.println("S\tNext byte to send\t" + ack);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static class SerialWriter implements Runnable {
OutputStream out;
DataInputStream inS;
DataOutputStream outHello;
byte[] mybytearray;
public SerialWriter(OutputStream out, DataInputStream in, DataOutputStream outHello, byte[] buffer) {
this.out = out;
inS = in;
this.outHello = outHello;
mybytearray = buffer;
}
public void run() {
try {
new Thread(new InReciever(inS)).start();
for (int i = 0; i < mybytearray.length; i++) {
//System.out.println("windowEnd \t"+windowEnd);
out.write(mybytearray[i]);
out.flush();
int timer = 0;
while (windowEnd > (windowStart + 2000) && !firstACK) {
timer++;
Thread.sleep(1000);
if (timer > 5) {
System.out.println("S\tTimeout \n Restart connection \t");
i = -1;
out.flush();
windowStart = 0;
windowEnd = 0;
firstACK = true;
}
//Thread.sleep(100);
//
}
windowEnd++;
}
outHello.writeChar('E');
outHello.flush();
System.out.println("s\tfinished sending");
brek = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}