سؤال

أنا أحاول أن أكتب عميل و خادم الوقت التخصيص و أنا أواجه مشكلة في الحصول على الخادم أن تتلقى الثاني طلب من العميل.الطلب الأول يمر بشكل جيد دون وجود عوائق.ثم انها مجرد الأكشاك.أنا فعلا جميلة فقدت في هذا كله شيء غير مريح نوعا ما مع جافا ، لذلك ليس لدي أي فكرة ما أنا في عداد المفقودين.أي مؤشرات هي موضع تقدير كبير.وذلك بفضل!

هنا قطع كود:

 import java.io.*;
 import java.util.*;
 import java.net.*;
 import java.text.*;

 public class myServer {

      protected static final int PORT_NUMBER = 55555;

      public static void main( String args[]) {

      try {

           ServerSocket servsock = new ServerSocket(PORT_NUMBER);

           System.out.println("Server running...");

           while(true) {

                Socket sock = servsock.accept();

                System.out.println("Connection from: " + sock.getInetAddress());

                Scanner in = new Scanner(sock.getInputStream());
                PrintWriter out = new PrintWriter(sock.getOutputStream());
                String request = "";

                request = in.next();

                System.out.println("Request: " + request);

                if(request.toUpperCase().equals("TIME")) {
                     out.println(getTime());
                     out.flush();
                } else {
                     out.println("Invalid Request...");
                     out.flush();
                }

            }

        } catch(Exception e) {
           System.out.println(e.toString());
        }

    }

      protected static String getTime() {
           DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
           Date date = new Date();
           return (dateFormat.format(date));
      }

}

هنا العميل:

 import java.io.*;
 import java.util.*;
 import java.net.*;

 public class myClient {

        protected static final String HOST = "127.0.0.1";
        protected static final int PORT = 55555;

        protected static Socket sock;

        public static void main(String args[]) {

        try {

              sock = new Socket(HOST,PORT);

              System.out.println("Connected to " + HOST + " on port " + PORT);

              Scanner response = new Scanner(sock.getInputStream());
              PrintWriter request = new PrintWriter(sock.getOutputStream());
              BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
              String txt = "";

              while(!txt.toUpperCase().equals("EXIT")) {

                    System.out.print("prompt:");
                    txt = in.readLine();

                    request.println(txt);
                    request.flush();

                    System.out.println(response.next());

              }

              request.close();
              response.close();
              in.close();
              sock.close();

           } catch(IOException e) {
              System.out.println(e.toString());
           }
      }

 }
هل كانت مفيدة؟

المحلول

وتحتاج إلى أن يكون حلقة في حين آخر، شيء من هذا القبيل،

  while(true) {                
      Socket sock = servsock.accept();                
      System.out.println("Connection from: " + sock.getInetAddress());                
      Scanner in = new Scanner(sock.getInputStream());                
      PrintWriter out = new PrintWriter(sock.getOutputStream());                
      String request = "";                
      while (in.hasNext()) {
          request = in.next();                
          System.out.println("Request: " + request);                
          if(request.toUpperCase().equals("TIME")) {                     
              out.println(getTime());
              out.flush();                
          } else {
               out.println("Invalid Request...");                     
               out.flush();
          }
      }
 }

نصائح أخرى

من PrintWriter مستندات:

لو التنظيف التلقائي تمكين سيتم القيام به فقط عندما يكون أحد println, printf, أو format أساليب الاحتجاج...

الخادم الخاص بك هو الدعوة print() و لم تمسح تيار ، وبالتالي فإن الوقت لم يحصل إرسالها.إما دعوة println() أو صراحة تدفق تيار.

كما server يغلق الاتصال فورا بعد إرسال ذلك الوقت ، وبالتالي فإن العميل الطلب الثاني دائما يفشل...

تحرير: هناك هوس المثير للاهتمام هنا - إغلاق PrintWriter يجب لطرد (انظر المواصفات من Writer), ولكن نظرا إلى ترتيب العمليات ما يبدو أن يحدث بدلا من ذلك هو:

  1. in.close() يغلق الأساسية Socket
  2. out.close() أن تدفق البيانات المكتوبة ، ولكن لا يمكن (كما مأخذ مغلق الآن)

متأكد من أن هذا هو بالضبط ما يحدث ، ولكن مبادلة ترتيب هذه بيانين تغيير سلوك يفترض إعطاء out.close() فرصة لطرد...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top