รับตัวอย่างสแต็กการติดตามนี้
เกิดจาก: java.net.SocketException: ซอฟต์แวร์ทำให้เกิดการยกเลิกการเชื่อมต่อ: ข้อผิดพลาด
ในการเขียนซ็อกเก็ตที่ java.net.SocketOutputStream.socketWrite0 (วิธีดั้งเดิม)
ฉันพยายามตอบคำถามต่อไปนี้:
- รหัสอะไรที่จะโยนข้อยกเว้นนี้ (JVM? / Tomcat? / รหัสของฉัน?)
- ทำให้เกิดข้อยกเว้นนี้จะถูกโยนอะไร
เกี่ยวกับ # 1:
แหล่งที่มาของ JVM ของซันไม่มีข้อความที่แน่นอนนี้ แต่ฉันคิดว่าข้อความซอฟต์แวร์ที่ทำให้เกิดการยกเลิกการเชื่อมต่อ: ข้อผิดพลาดในการเขียนซ็อกเก็ตเกิดจากการใช้งานดั้งเดิมSocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
เกี่ยวกับ # 2
ฉันเดาว่ามันเกิดขึ้นเมื่อลูกค้าได้ยกเลิกการเชื่อมต่อก่อนที่จะได้รับการตอบสนองอย่างเต็มที่ (เช่นส่งคำขอ แต่ก่อนที่จะได้รับการตอบสนองอย่างเต็มรูปแบบมันก็ปิด / ยุติ / ออฟไลน์)
คำถาม:
- สมมติฐานข้างต้นถูกต้อง (# 1 และ # 2) หรือไม่
- สิ่งนี้สามารถแตกต่างจากสถานการณ์: "ไม่สามารถเขียนถึงลูกค้าเนื่องจากข้อผิดพลาดของเครือข่ายทางฝั่งเซิร์ฟเวอร์ " หรือไม่? หรือว่าจะทำให้ข้อความผิดพลาดเดียวกัน?
- และที่สำคัญที่สุด: มีเอกสารอย่างเป็นทางการ (เช่นจากซัน) ที่ระบุข้างต้นหรือไม่?
ฉันต้องมีหลักฐานว่าการติดตามสแต็กนี้เป็น "ความผิดพลาด" ของซ็อกเก็ตไคลเอ็นต์และไม่มีสิ่งใดที่เซิร์ฟเวอร์สามารถทำได้เพื่อหลีกเลี่ยงปัญหานี้ (ยกเว้นการจับข้อยกเว้นหรือการใช้ไม่ใช่ JVM SocketOutputStream แม้ว่าทั้งสองจะไม่หลีกเลี่ยงความจริงที่ว่าไคลเอ็นต์ได้ยกเลิก)
outs.write(audioBytes);
) ในการที่จะbyte[]
OutputStream
เมื่อเสียงกำลังคลี่คลายและในขณะที่เล่นถ้าผู้ใช้คลิกที่เมนูอื่น ๆ (ซึ่งส่งคำขอเซิร์ฟเวอร์) ฉันได้รับข้อผิดพลาดเดียวกันบนคอนโซล ดังนั้นจะปลอดภัยหรือไม่ที่จะละเว้นข้อยกเว้นนี้