ฉันเขียนไคลเอนต์ซึ่งโดยพื้นฐานแล้วเพียงแค่เปิดซ็อกเก็ตและส่งเนื้อหาผ่านการเชื่อมต่อ (เนื้อหาเป็นไปตามโปรโตคอล Http)
ปัญหาที่ฉันกำลังเผชิญเกี่ยวกับคำถาม - ฉันควรปิดการเชื่อมต่ออย่างไรและเมื่อใด ปัญหาคือบางครั้งการเชื่อมต่อปิดเร็วเกินไป ("FIN" ถูกส่งไปยังเซิร์ฟเวอร์ก่อนที่เซิร์ฟเวอร์จะตอบกลับ)
ในกรณีนี้ คำตอบของเซิร์ฟเวอร์หายไป
ฉันพยายามใช้ Thread.sleep ก่อนที่จะปิดการเชื่อมต่อ แต่ดูเหมือนว่าจะไม่มีอะไรส่งผลกระทบต่อเวลาระหว่างการส่งเนื้อหาและการส่งข้อความ "FIN" (ดูใน Wireshark)
บางครั้งคำตอบก็มาถึงและบางครั้งก็ไม่ได้ (สภาพการแข่งขัน)
ฉันจะหน่วงเวลาข้อความ "FIN" เพื่อไม่ให้พลาดการตอบกลับของเซิร์ฟเวอร์ได้อย่างไร
ฉันเพิ่มคลาสที่เกี่ยวข้องแล้ว ฟังก์ชันที่เกี่ยวข้องคือ sendContentOverSocket
public class SocketClient {
private String hostName;
private int portNumber;
private Socket ConnectionSocket;
public void init(String hostName, int portNumber){
this.hostName = hostName;
this.portNumber = portNumber;
this.ConnectionSocket=createSocketConnection();
}
private Socket createSocketConnection() {
Socket socket = null;
try {
socket = new Socket(this.hostName, this.portNumber);
return socket;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return socket;
}
public void sendContentOverSocket(String content) {
try {
PrintWriter out = new PrintWriter(
ConnectionSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
ConnectionSocket.getInputStream()));
out.print(content);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.close();
in.close();
ConnectionSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}