لماذا لا يقرأ موكلي بشكل صحيح جهاز OutputStream الذي أرسله الخادم؟

StackOverflow https://stackoverflow.com/questions/3826099

سؤال

إنه خادم بسيط للعميل حيث الخادم باستخدام BufferedWriter سوف يرسل الكائن إلى عميل تلقي في الكائن BufferedReader.

عندما أستخدم OutputStream و PrintWriter ل الخادم و InputStream و Scanner ل عميل أنه يعمل بشكل جيد.

ما يحدث هو أن العميل في مخزن مؤقت تقرأ الطريقة -1 إذا أرسلت int و باطل ل سلسلة.

آمل أن تكون لغتي الإنجليزية منطقية. ؛ ص

هذا هو الكود:

الخادم:

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

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket server = new ServerSocket(8189);
        Socket incoming;

        incoming = server.accept();
        try {
            // OutputStream output = incoming.getOutputStream();
            // PrintWriter outStream = new PrintWriter(output, true /*autoFlush*/);
            // outStream.println("ENTER");
            BufferedWriter output = new BufferedWriter(new           
                                    OutputStreamWriter(incoming.getOutputStream()));
            output.write(3);
            System.out.println("\nSent");

        } finally {
            incoming.close();
        }
    }
}

عميل:

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

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {

        //Client theClient= new Client();
        Socket RTSPSocket;
        int ServerPort = 8189;
        //server name address
        String ServerHost = "localhost";

        //get Server IP Address
        InetAddress ServerIPAddress = InetAddress.getByName(ServerHost);

        RTSPSocket = new Socket(ServerIPAddress, ServerPort);

        try {
            /*
            InputStream input = theClient.RTSPSocket.getInputStream();
            Scanner in = new Scanner(input);
            String line = in.nextLine();
            System.out.println(line);
            */

            BufferedReader input = new BufferedReader(new  
                                   InputStreamReader(RTSPSocket.getInputStream()));

            //String line = input.readLine();
            //System.out.println("\nRicevuto: " + line);
            System.out.println(input.read());
        } catch (Exception e) {
            System.err.println("Error: " + e);
        }
    }
}
هل كانت مفيدة؟

المحلول

يجب عليك مسح البيانات لاستلامها في جزء العميل.

        output.write(3);
        output.flush();
        System.out.println("\nSent");

عندما يكون لديك outputstream (أو كاتب) ، يجب عليك مسح بياناتك ، وبهذه الطريقة أنت متأكد بنسبة 100 ٪ من أن ما تريد إرساله قد تم إرساله.

معظم (إن لم يكن كل) الفئات الفرعية OutputStream تستخدم "مخزن مؤقت صغير" يتم مسحه فقط عندما يكون ممتلئًا أو تتصل يدويًا flush(). في حالتك ، إنها أكثر صرامة لأنك تستخدم BufferedWriter.

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


موارد :

نصائح أخرى

حاول وضع الكود التالي بعد الإخراج. write (3) ؛

output.flush();

تم تصميم bufferedoutputstream لإرسال البيانات فقط عندما يكون المخزن المؤقت ممتلئًا (أعتقد أن البايتات الافتراضية 1024). لذلك ، لإجبار البيانات على إرسالها ، تحتاج إلى مسح الدفق.

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