السلام عليكم
هذا الموضوع لنقاش أي شيء له علاقة بتطوير خادم شارك
لكي يتحمل أكبر ضغط ممكن من الطلبات
كنت بدأت النقاش في هذا الموضوع هنا وفي الردود التي تليه
هل من آراء أو اقتراحات حول الموضوع؟
وأنا أقرأ في الشيفرة وجدت هذا
public ServerListen() {
try {
System.out.println("JKelany Chat Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
OutputFrame.appendText("JKelany Chat Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
serverSocket = new ServerSocket(PORT);
while (true) {
HandleClientRequest handleClient = new HandleClientRequest(serverSocket.accept());
handleClient.start();
emailsSockets.add(handleClient);
informAll();
}
} catch (IOException ex) {
OutputFrame.appendText(ex.getMessage());
}
}قمت بتغييره إلى الشكل التالي
public ServerListen() {
try {
System.out.println("Sharek Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
OutputFrame.appendText("Sharek Listen to ip " + InetAddress.getLocalHost() + ":" + PORT);
serverSocket = new ServerSocket(PORT);
} catch (IOException ex) {
OutputFrame.appendText(ex.getMessage());
}
}
public void startListen() {
while (true) {
try {
HandleClientRequest handleClient = new HandleClientRequest(serverSocket.accept());
handleClient.start();
emailsSockets.add(handleClient);
informAll();
} catch (IOException ex) {
OutputFrame.appendText(ex.getMessage());
}
}
}طبعاً واضح هنا أن وضع تكرار داخل عملية الباني غير محبذة بالمرة
وغير معروف سلوك الآلة الإفتراضية تجاه هكذا شيء
نقطة أخرى
في الدالة informAll
public static void informAll() {
try {
for (int i = 0; i < emailsSockets.size(); i++) {
emailsSockets.get(i).notifyClient();
}
} catch (Exception e) {
OutputFrame.appendText(e.getMessage());
}
}هذه الشيفرة مسؤولة عن إعلام المستخدمين الموجودين على النظام بأن هناك شخص جديد دخل على الخادم
مبدئياً الفكرة نفسها ليست جدية لأن هذا يسمح للمراقب على الشبكة عند العميل بمعرفة من دخل على النظام حتى ولو لم يكن له علاقة به
التنفيذ أيضاً للفكرة غير جيد
لأن خطأ في الدالة notifyClient لأي عميل يعني أن العملاء الآخرين لن يتم إخبارهم أيضاً
أقترح إعلام الأشخاص الذي يكون الشخص الجديد على النظام صديقاً لهم
عدى عن ذلك لا تعلمهم
ويجب وضع الtry-catch حول الجملة نفسها وليس حول التكرار ككل أي كالتالي
public static void informAll() {
for (int i = 0; i < emailsSockets.size(); i++) {
try {
emailsSockets.get(i).notifyClient();
} catch (Exception e) {
OutputFrame.appendText(e.getMessage());
}
}
}وبدلاً من عمل ArrayList في الفئة اقترح HashMap لأنها ستسهل البحث على المستخدمين بأسمائهم
في انتظار سماع آراءكم حول الموضوع والمناقشة
قمت ببعض التعديلات البسيطة
قوموا بسحبها check out من خادم SVN
تحياتي
