لماذا لا يقرأ موكلي بشكل صحيح جهاز OutputStream الذي أرسله الخادم؟
-
26-09-2019 - |
سؤال
إنه خادم بسيط للعميل حيث الخادم باستخدام 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). لذلك ، لإجبار البيانات على إرسالها ، تحتاج إلى مسح الدفق.