سؤال

ببساطة كنت أحاول تنفيذ ما BufferedStreamReader يفعل في جافا. لدي دفق المقبس مفتوحا وتريد فقط قراءته في خط أزياء موجه نحو الخط حسب الخط.

لدي رمز الخادم التالي.

while (continueProcess)
        {
            try
            {
                StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8);
                string command = reader.ReadLine();
                if (command == null)
                    break;

                OnClientExecute(command);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

وكود العميل التالي:

TcpClient tcpClient = new TcpClient();
        try
        {
            tcpClient.Connect("localhost", serverPort);
            StreamWriter writer = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
            writer.AutoFlush = true;
            writer.WriteLine("login>user,pass");
            writer.WriteLine("print>param1,param2,param3");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        finally
        {
            tcpClient.Close();
        }

يقرأ الخادم السطر الأول فقط (login>user,pass) وثم ReadLine إرجاع null!

ما هي أسهل طريقة لتحقيق القارئ الموجه نحو الخط كما هو الحال في جافا BufferedStreamReaderب :س

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

المحلول

قارئ خط نموذجي هو شيء مثل:

using(StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8)) {
    string line;
    while((line = reader.ReadLine()) != null) {
        // do something with line
    }
}

(لاحظ ال using لضمان أننا Dispose() حتى لو تلقينا خطأ، والحلقة)

إذا كنت ترغب في ذلك، فيمكنك مجردة هذا (فصل المخاوف) مع كتلة للماء المقطوعة:

static IEnumerable<string> ReadLines(Stream source, Encoding encoding) {
    using(StreamReader reader = new StreamReader(source, encoding)) {
        string line;
        while((line = reader.ReadLine()) != null) {
            yield return line;
        }
    }
}

(لاحظ أننا نقلنا ذلك إلى وظيفة وإزالة "القيام بشيء"، واستبداله ب "عودة العائد"، مما يخلق جهاز كمتقل (آلة حالة قياسية غير مؤهلة بخلفية)

سنتهلح ذلك ببساطة على النحو التالي

foreach(string line in ReadLines(Socket.GetStream(), Encoding.UTF8)) {
    // do something with line
}

الآن رمز المعالجة لدينا لا داعي للقلق كيف لقراءة الخطوط - ببساطة منح سلسلة من الخطوط، تفعل شيئا معهم.

نلاحظ أن using (Dispose()) ينطبق على TcpClient جدا؛ يجب أن تجعل عادة التحقق من أجل IDisposable; ؛ على سبيل المثال (لا يزال بما في ذلك تسجيل الأخطاء الخاص بك):

using(TcpClient tcpClient = new TcpClient()) {
    try {
       tcpClient.Connect("localhost", serverPort);
       StreamWriter writer = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
       writer.AutoFlush = true;
       writer.WriteLine("login>user,pass");
       writer.WriteLine("print>param1,param2,param3");
    } catch (Exception ex) {
        Console.Error.WriteLine(ex.ToString());
    }
}

نصائح أخرى

أثناء إعداد رمز الخادم الخاص بك إلى قراءة سطر واحد فقط لكل اتصال. ستحتاج إلى آخر أثناء محاولة قراءة جميع الخطوط التي يتم إرسالها. أعتقد بمجرد إعداد هذا الدفق على جانب العميل، سوف يرسل كل البيانات. ثم على جانب الخادم، يقوم مجرىك بقراءة سطر واحد بشكل فعال من هذا الدفق المحدد.

حاول هذا وحصلت

تعذر العثور على اسم نوع أو اسم الاسم "دفق" (هل تفتقد استخدام التوجيه أو مرجع التجميع؟) تعذر العثور على اسم أو اسم الاسم "StreamReader" (هل تفتقد استخدام التوجيه أو مرجع التجميع؟) تعذر العثور على اسم أو اسم الاسم "StreamReader" (هل تفتقد استخدام التوجيه أو مرجع التجميع؟) "System.net.sockets.sockets.socket 'لا يحتوي على تعريف ل" GetStream "

    public string READS()
    {
        byte[] buf = new byte[CLI.Available];//set buffer
        CLI.Receive(buf);//read bytes from stream
        string line = UTF8Encoding.UTF8.GetString(buf);//get string from bytes
        return line;//return string from bytes
    }
    public void WRITES(string text)
    {
        byte[] buf = UTF8Encoding.UTF8.GetBytes(text);//get bytes of text
        CLI.Send(buf);//send bytes
    }

كلية هي مأخذ. بالنسبة لبعض Rezone لا تعمل فئة TCPClient مباشرة على جهاز الكمبيوتر الخاص بي بعد الآن، لكن فئة المقبس تعمل على ما يرام.

UTF-8 هو ترميز StreamReader / Writer

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