Vì vậy, tôi có hai chủ đề.Chủ đề PrintWriter của socket Java có an toàn không?
Chủ đề quản lý kết nối máy khách. (Chỉ có một khách hàng và một máy chủ)
Tôi gọi đó là chuỗi máy chủ của tôi.
Thread two quản lý việc gửi tin nhắn cho khách hàng. Tôi gọi nó là chuỗi xử lý tin nhắn của tôi.
Chủ đề chịu trách nhiệm, trong số những thứ khác gửi nhịp tim cho khách hàng theo định kỳ.
Khi lập trình tôi giả định rằng các ổ cắm không an toàn, nhưng các bộ đệm, và miễn là tôi đang sử dụng bộ đệm riêng biệt cho máy chủ và các bộ xử lý, tôi sẽ ổn.
Tôi cũng đưa ra giả định rằng "PrintWriter" tương tự như bộ đệm socket trong Java.
Theo các giả định này tôi đã viết chức năng này để gửi một nhịp tim:
public void sendHeartBeat(){
logger.info("Sending a hearbeat!");
PrintWriter printWriter=null;
try {
printWriter = new PrintWriter(clientSocket.getOutputStream());
} catch (IOException e) {
logger.info(e.toString());
}
if(printWriter!=null){
printWriter.print("HEARTBEAT#");
printWriter.flush();
}
}
Các chủ đề khác, "xử lý" một điều gì đó tương tự ở chỗ nó:
printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());
Theo cách này Tôi sẽ tạo ra một "bộ đệm" mới mỗi khi tôi muốn gửi một nhịp tim, và các tin nhắn của tôi sẽ không bao giờ bị ghi đè.
Thật không may điều này dường như không đúng. Và tôi nhận được một tin nhắn đến qua đường ống như sau: dsgdsbHEARTBEAT # sdg
Điều này gây ra một kết xuất cốt lõi sau đó.
Dưới đây là những câu hỏi của tôi:
1) Sockets rõ ràng là không đề an toàn, nhưng là PrintWriters tôi nhận được từ họ chủ đề an toàn? Hay là nó chỉ trả về cùng một PrintWriter?
2) Tương tự như bộ đệm socket trong Java là gì? Tôi nên suy nghĩ như thế nào về vấn đề này?
3) Làm cách nào để làm cho các chuỗi này không ghi vào cùng một bộ đệm trên ổ cắm?
Tôi đã xem xét Java SE 1.6.0_31 src cho việc này. 'PrintWriter (Writer out)' cuối cùng gọi là 'Writer được bảo vệ (Object lock)' và ở đó, 'Writer' gán 'khóa' này vào 'khóa' bên trong được sử dụng trong 'Writer' để đồng bộ hóa. Vì vậy, bạn có thể pl. giải thích tại sao bạn nghĩ khóa bị hỏng ở đây? – shrini1000
@ shrini1000 'PrintWriter' gọi' Writer (Object lock) 'với' super (out); '. Vì vậy, 'lock' là' out', thay vì 'out.lock'. (Đây là vấn đề triển khai - đặc điểm kỹ thuật dường như bị thiếu.) –
Điều này dường như vẫn xảy ra trong Java 8 - PrintWriter gọi super (out) và khóa bị tắt thay vì out.lock. –