2011-04-29 22 views
5

पर एकाधिक बाइट सरणी भेजना मैं क्लाइंट और सर्वर से एकाधिक बाइट सरणी भेजना चाहता हूं?सॉकेट

मैं भेजने के लिए/ग्राहक से एक बाइट सरणी प्राप्त करें और भेजें/सर्वर से एक बाइट सरणी प्राप्त कर रहा था:

मेरे कोड इस तरह है:

सर्वर:

Socket sock=null; 
    ByteArrayOutputStream input=null; 
    OutputStream out=null; 
    InputStream in=null; 
    try{ 
     ServerSocket server_sock=new ServerSocket(2972); 


    sock=server_sock.accept(); 

    in = 
     sock.getInputStream(); 
    out=sock.getOutputStream(); 
    }catch(IOException e){ 
     System.out.println(e.getMessage()); 
    } 
String word=""; 

    //1-Receive 

    try{ 

    ByteArrayOutputStream serverinput=new ByteArrayOutputStream(); 
int len=0; 
byte[] buf=new byte[1000]; 
     while ((len = in.read(buf))>=0) { 
       serverinput.write(buf, 0, len); 

     } 

     sock.shutdownInput(); 

     word=new String(serverinput.toByteArray()); 
    System.out.println("Client send 1"+word); 

    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 


    String st="Server is a king"; 
try{ 
    out.write(st.getBytes()); 

    out.flush(); 

}catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 

ग्राहक:

Socket sock=null; 
    OutputStream out=null; 
    InputStream in=null; 


    try{ 
     sock=new Socket("127.0.0.1",2972); 
     }catch(IOException e){ 
     System.out.println(e.getMessage()); 
    } 


String word="Hellow World" ; 
    try{ 
    in = 
     sock.getInputStream(); 
    out=sock.getOutputStream(); 
    }catch(IOException e){ 
     System.out.println(e.getMessage()); 
    } 

//1- send 
    try{ 

     System.out.println("Your string is"+word+"converted to byte"+word.getBytes()); 

    out.write(word.getBytes()); 
    out.flush(); 
sock.shutdownOutput(); 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 

    try{ ByteArrayOutputStream serverinput=new ByteArrayOutputStream(); 
int len=0; 
byte[] buf=new byte[1000]; 
     while ((len = in.read(buf))>=0) { 
       serverinput.write(buf, 0, len); 


     } 
    System.out.println("server send 1 "+new String(serverinput.toByteArray())); 
    System.out.println("Your string is"+word+"converted to byte"+word.getBytes()); 

    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 

यह कोड क्लाइंट और सर्वर से सबमिट करने के लिए ठीक काम कर रहा है लेकिन जब मैं अधिक बाइट सरणी भेजना/प्राप्त करना चाहता हूं तो यह काम नहीं करता है?

यह केवल तब काम कर रहा है जब मैं शट डाउन का उपयोग करता हूं क्योंकि क्लाइंट और सर्वर दोनों डेटा पढ़ने और लिखने के लिए।

इसलिए, मैं सॉकेट चैनल का फिर से उपयोग नहीं कर सकता ... क्या वैकल्पिक समाधान है? ... जो डेडलॉक का कारण नहीं है।

उत्तर

13

आपके पास समस्या यह है कि वर्तमान में आपके पास यह कहने का कोई तरीका नहीं है कि एक बाइट सरणी समाप्त हो जाती है और अगला वाला प्रारंभ होता है। (आपके "एक सरणी" समाधान में, बाइट सरणी का अंत धारा के अंत से मेल खाता है। और निश्चित रूप से, स्ट्रीम समाप्त होने/बंद होने के बाद, इसे नया Socket, इत्यादि बनाने के बिना फिर से खोल नहीं किया जा सकता है।)

हल करने के लिए इस, के रूप में इस प्रकार है DataOutputStream और DataInputStream जोड़े संबंधित सॉकेट धाराओं के चारों ओर लिपटा उपयोग कर रहा है आसान तरीका:

  1. बाइट्स डेटा कन्वर्ट:

    • एक बाइट सरणी भेजने के लिए।

    • DataOutputStream.writeInt(int) विधि का उपयोग कर बाइट सरणी आकार भेजें।

    • DataOutputStream.write(byte[]) विधि का उपयोग करके बाइट सरणी भेजें।

  • एक बाइट सरणी प्राप्त करने के लिए:

    1. DataInputStream.readInt() पद्धति का उपयोग करके बाइट सरणी आकार प्राप्त करें।

    2. आवश्यक आकार की बाइट सरणी आवंटित करें।

    3. DataInputStream.read(byte[], int, int) विधि का उपयोग करके बाइट सरणी में बाइट प्राप्त करें ... बार-बार जब तक आप सभी बाइट प्राप्त नहीं कर लेते हैं।

  • मोर्चे पर बाइट सरणी के आकार भेज कर, आप रिसीवर कितने बाइट्स पढ़ने के लिए बताओ। आप इस प्रक्रिया को जितनी बार चाहें उतनी बार दोहरा सकते हैं। प्रेषक रिसीवर को इंगित कर सकता है कि सॉकेट स्ट्रीम को बंद करके भेजने के लिए कोई और बाइट एरे नहीं है।

    नोट - यह छद्म कोड है। मुझे लगता है कि आप इसे जावा में काम करने में सक्षम हैं।

    सिस्टम कॉल ओवरहेड्स को कम करने के लिए संबंधित स्ट्रीम श्रृंखलाओं में BufferedInputStreams और BufferedOutputStreams डालने के लिए मत भूलना।

    +1

    पर डेटा को बदल रहा है यह काम है ... बहुत बहुत धन्यवाद। –

    +0

    अच्छा जवाब, यह मेरे लिए भी काम करता है! धन्यवाद। – cabreracanal

    +0

    @Javalover ... एह, क्या आप इसे काम करने के बाद वहां कोड साझा करना चाहते हैं? – gumuruh

    0

    डेटा सॉफ़्टस्ट्रीम और डेटाऑटपुटस्ट्रीम में अपनी सॉकेट स्ट्रीम को लपेटने का प्रयास करें। आपको जो भी चाहिए वो करने की अनुमति देनी चाहिए।

    +0

    मैंने किया था, लेकिन यह काम नहीं करता है ... –

    +0

    @Javalover तो फिर तुम इसे सही ढंग से नहीं किया और यह बहुत मुश्किल है जब तक आप पोस्ट आप क्या किया प्रतिबिंबित करने के लिए अद्यतन हमें आपकी मदद करने के लिए है। – Fredrik

    0

    आप वास्तव में इस ट्यूटोरियल पर एक नज़र होनी चाहिए: Reading from and Writing to a Socket

    यह रूपरेखा तैयार करने और पढ़ने के लिए एक सॉकेट में लिखने के लिए कैसे लगता है। पठन को सर्वर सॉकेट बनाने और आपके द्वारा अपेक्षित बंदरगाह पर सुनने और फिर डेटा की प्रतीक्षा करने जितना आसान होना चाहिए।

    +0

    यह सॉकेट द्वारा लिखना या पढ़ना नहीं है, यह नेटवर्क –

    0

    आप एक ऑब्जेक्ट भी बना सकते हैं जो आपके बाइट सरणी को पकड़ लेगा और इसे ObjectOutputStream के साथ भेज देगा, फिर जानकारी भेजने के लिए writeObject(Object) विधि का उपयोग करें।