फ़ाइल भेजने के लिए ग्राहक/सर्वर कहीं अटक जाते हैं

मैंने फ़ाइलों को भेजने के लिए एक क्लाइंट/सर्वर लागू किया है। जब फ़ाइल भेजने के बाद कोई और संदेश आदान-प्रदान नहीं किया जाता है, तो कोड पूरी तरह से काम करता है, लेकिन यदि क्लाइंट फ़ाइल प्राप्त करने के कोड के बाद सीधे सर्वर पर कुछ स्ट्रिंग भेजता है तो क्लाइंट और सर्वर दोनों कुछ भी करना बंद कर देते हैं और फ़ाइल नहीं भेजी जाती है जैसे कि वे दोनों डेडलॉक में फंस गए हैं लेकिन मुझे सच में यकीन नहीं है:

फ़ाइल के बाद कुछ भी भेजने के बिना कोड भेजने के लिए कोड है, जो काम करता है: ग्राहक

String filename;
BufferedReader UIn = new BufferedReader(new InputStreamReader(System.in));
Socket peer = new Socket("localhost",9999);
System.out.print("Enter the file name to download :");
filename= UIn.readLine();

///////////////////////////////

DataOutputStream OutToServer;
OutToServer = new DataOutputStream(peer.getOutputStream());
OutToServer.writeBytes(filename+"\n");

FileOutputStream fos = new FileOutputStream(new File("D:/new.txt"));
BufferedOutputStream  out = new BufferedOutputStream(fos);
InputStream in = peer.getInputStream();
buffer = new byte[1024];

while((count=in.read(buffer))>0)
{
  fos.write(buffer, 0, count);
  System.out.println(buffer);
}

fos.close();
System.out.println("done");

सर्वर:

ServerSocket server =null; 
try {
  server = new ServerSocket(9999);
  while(true)
  {
    client= server.accept();
    //System.out.println("Connection accepted");
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
    DataOutputStream outToclient =new DataOutputStream(client.getOutputStream());
    String request=inFromClient.readLine();
    file = new File(request);

    if (file.exists())
    {
      OutputStream out = client.getOutputStream();
      BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));

      while((count =in.read(buffer)) >0)
      {
        out.write(buffer,0,count);
        out.flush();
      }
    }

   //System.out.println(request);
   //outToclient.writeBytes("alaa\n");

  }
} catch (IOException ex) {
  Logger.getLogger(ServerWork.class.getName()).log(Level.SEVERE, null, ex);
}

लेकिन अगर मैं क्लाइंट और सर्वर के बीच लूप के बाद कुछ भी भेजने की कोशिश करता हूं तो यह काम करना बंद कर देता है। ऐसा इसलिए है क्योंकि मैं readLine() और writeBytes() का उपयोग कर रहा हूं?

0
क्या!!!! @Makky
जोड़ा लेखक Alaa, स्रोत
आपको यहां मजाक नहीं करना चाहिए!
जोड़ा लेखक Alaa, स्रोत

1 उत्तर

आप डेटाऑटपुटस्ट्रीम और आउटपुटस्ट्रीम दोनों का उपयोग कर रहे हैं। मुझे लगता है कि वे एक साथ काम करना चाहिए, लेकिन मुझे लगता है कि आपको क्या करना चाहिए flush बफर (या इसे बंद करें) करना है।

जो कुछ भी आप भेजना चाहते हैं उसे लिखने के बाद, कुछ डेटा अभी भी बफर में हो सकते हैं। अब आपको बफर को फ्लश करना होगा, इसे सभी डेटा भेजने के लिए मजबूर करना होगा। (जैसा कि यहां कहा गया है)

outToclient.writeBytes("alaa\n");
outToclient.flush();
0
जोड़ा
क्या आउटपुटस्ट्रीम और डेटाऑटपुटस्ट्रीम दोनों का उपयोग करना एक समस्या है?
जोड़ा लेखक Alaa, स्रोत
तो अब अगर मैं दोनों तरफ DataOutputStream का उपयोग करता हूं, तो समस्या हल हो जाएगी? और वास्तव में पहली बार समस्या को समझने में मेरी मदद करने के लिए बहुत बहुत धन्यवाद, इसकी सराहना की गई है
जोड़ा लेखक Alaa, स्रोत
आपकी मदद के लिए बहुत बहुत धन्यवाद .. आपके नोट्स के लिए धन्यवाद मेरी सभी समस्याओं का हल हो गया है। धन्यवाद
जोड़ा लेखक Alaa, स्रोत
क्लाइंट साइड पर @Alaa, आप इनपुट इनपुट का उपयोग कर रहे हैं, न कि DataInputStream। इस प्रकार, आप सर्वर पक्ष पर DataOutputStream की writeBytes विधि का उपयोग करने का लाभ नहीं लेते हैं। फिर आप आउटपुटस्ट्रीम का उपयोग करके, अतिरिक्त संदेश भेजने का एक और तरीका ढूंढने का प्रयास कर सकते हैं।
जोड़ा लेखक Setilă, स्रोत
मुझे यकीन नहीं है लेकिन यह काम करना चाहिए। यदि यह काम नहीं कर रहा है तो बफर को फ्लश को न भूलें। वैसे भी, हमें परिणाम बताओ।
जोड़ा लेखक Setilă, स्रोत