المقبس - عميل جافا ، خادم C #

أقوم بعمل برنامج في جزئين.

الجزء 1: C# تطبيق خادم مقبس يعمل على جهاز الكمبيوتر ، والاستماع للأوامر ، ويعمل وفقا لذلك.

الجزء 2: تطبيق Java-client يعمل على الهاتف ، والذي يرسل أمرًا إلى الكمبيوتر ، عند الضغط على زر.

حاليا ، يمكنني إرسال الأوامر من العميل إلى الخادم ، وكلها جيدة. ولكن مشكلتي هي: عندما أرسل أمرًا محددًا إلى الخادم ، أريد أن يرد الخادم على العميل ، وأن يقرأ العميل هذا الرد.

الشيء هو فقط ، عندما يحاول العميل أن يقرأ ، مهلة.

برنامج عميل Java:

class ClientThread implements Runnable 
{   
    public void run() 
    {
        try 
        {
            Socket socket = new Socket(serverIpAddress, serverPort);
            socket.setSoTimeout(5000);

            while (true) 
            {
                try 
                {
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                    Log.d("Nicklas", "Out it goes");
                    out.println(Command);

                    if (Command == "CMD:GetOptions")
                    {
                        Log.d("Nicklas", "Getting options");
                        try
                        {
                            Log.d("Nicklas", "Line 1");
                            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            Log.d("Nicklas", "Line 2");
                            String answer = in.readLine();
                            Log.d("Nicklas", "answer = " + answer );
                        }
                        catch (Exception ee)
                        {
                            Log.d("Nicklasasasas", ee.toString());
                        }
                    }
                    break;

                } 

                catch (Exception e) 
                {
                    Log.d("Nicklas", "CAE = " + e.toString());
                    break;

                } 
            }
            socket.close();
        } 
        catch (ConnectException ee)
        {
            Log.d("Nicklas", "Kunne ikke forbinde");

        }
        catch (Exception e) 
        {
            Log.d("Nicklasssssss", e.toString());
        }
    }
}

هذا ما يسمى بـ:

Thread cThread = new Thread(new ClientThread());
        cThread.start();

ويستخدم المتغير العام "Command" ، والذي سيحتوي على معلومات مختلفة ، اعتمادًا على الضغط على أي زر.

فشل البرنامج على السطر "String answer = in.readline ()؛" مع استثناء "java.net.SocketTimeoutException".

هذا هو الجزء C# Server من البرنامج:

private void ListenForClients()
    {
        this.tcpListener.Start();

        while (true)
        {
            //blocks until a client has connected to the server
            TcpClient client = this.tcpListener.AcceptTcpClient();

            //create a thread to handle communication
            //with connected client
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                //blocks until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                //a socket error has occured
                break;
            }

            if (bytesRead == 0)
            {
                //the client has disconnected from the server
                break;
            }

            //message has successfully been received
            ASCIIEncoding encoder = new ASCIIEncoding();
            //System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
            string Input = (encoder.GetString(message, 0, bytesRead));
            Input = Input.Trim();
            object[] obj = new object[1];
            obj[0] = Input;
            if (Input == "CMD:GetOptions")
            {
                try
                {
                    byte[] buffer = encoder.GetBytes("CMD:Accepted");
                    clientStream.Write(buffer, 0, buffer.Length);
                    clientStream.Flush();
                    MessageBox.Show("Client program asked for reply");
                }
                catch (Exception e)
                {
                    MessageBox.Show("Oh it no work!: " + e.ToString());
                }
            }
            else
            {
                Udfor(Input);
            }


        }

        tcpClient.Close();
    }

استدعاؤه مع ما يلي في Form1 ()

this.tcpListener = new TcpListener(IPAddress.Any, 4532);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();

يبدو أن خادم C# يعمل بشكل جيد ، ولا يعرض مربع الرسالة "برنامج العميل يطلب الرد"

أي شخص يمكنه اكتشاف الخطأ؟

0
حسنا ، أنا لست متأكدًا بنسبة 100٪ ، ولكن 99٪ C# Program: if (Input == "CMD: GetOptions ") {byte [] buffer = encoder.GetBytes ("CMD: Accepted")؛ clientStream.Write (المخزن المؤقت ، 0 ، buffer.Length) ؛ clientStream.Flush ()؛ MessageBox.Show ("أوه أرادت zeh خيارات") ؛ } يتم تشغيل هذا بعد تلقي رسالة. يظهر أيضًا messageBox في النهاية ، لذا أنا متأكد من أنه يرسل الرد
وأضاف المؤلف user1285334, مصدر
هل أنت مشكلة أن العميل لا يبدو لتلقي استجابة من الخادم؟ يتم طرح SocketTimeoutException عند تلقي أي استجابة بواسطة مأخذ التوصيل خلال المهلة المحددة ، 5 ثوان في المثال الخاص بك. هل أنت متأكد من أن الخادم يرسل الاستجابة؟
وأضاف المؤلف Kerry, مصدر

1 إجابة

اكتشفتها! كانت المشكلة C #. عندما أرسل الخادم مرة أخرى الأمر "CMD: Accepted" ، فإنه لم يغلق المقبس أبدًا ، لذا لم يكن تطبيق Android لديه فكرة عن ما إذا كان قد انتهى من القراءة! إغلاق المقبض مباشرة بعد شطف + بالطبع لا تغلقه مرة أخرى إذا فعلت بالفعل ، فعل الخدعة!

0
وأضاف
Android Sudan Community
Android Sudan Community
900 مشارك

كل اقتراحاتكم تتم مشاركتها هنا رابط القناة لتنزيل البرامج والالعاب من هنا @android_sudan تنبيه : القروب غير مختص إطلاقا بي الانترنت المجاني مثل ملفات الحاقن وماشابه يمنع منعا باتا نشر اي ملفات او برامج او اي شيء يتعلق بالانترنت المجان