2010-05-21 13 views
24

पर बाइट्स की सरणी कैसे भेजें, क्या कोई यह दिखा सकता है कि एक प्रेषक प्रोग्राम से एक टीसीपी कनेक्शन पर बाइट्स की सरणी को जावा में एक रिसीवर प्रोग्राम में कैसे भेजना है।एक टीसीपी कनेक्शन (जावा प्रोग्रामिंग)

byte[] myByteArray 

(मैं जावा प्रोग्रामिंग करने के लिए नया हूँ, और यदि आप एक मौजूदा उदाहरण के बारे में पता है, तो ऐसा करने के तरीके का एक उदाहरण है कि) कनेक्शन के दोनों सिरों (प्रेषक और प्राप्तकर्ता। पता चलता खोजने के लिए नहीं कर पा रहे , हो सकता है आप लिंक पोस्ट कर सकते हैं। (पहिया बदलने की आवश्यकता नहीं है।) पी एस यह नहीं होमवर्क है! :-)

उत्तर

54

InputStream और OutputStream कक्षाएं देशी रूप बाइट सरणियों संभाल। एक चीज जिसे आप जोड़ना चाहते हैं वह संदेश की शुरुआत में लंबाई है ताकि रिसीवर जानता है कि कितने बाइट्स की उम्मीद है। मैं आम तौर पर एक विधि प्रदान करना पसंद करता हूं जो मानक एपीआई की तरह, बाइट सरणी में भेजने के लिए बाइट्स को नियंत्रित करने की अनुमति देता है।

कुछ इस तरह:

private Socket socket; 

public void sendBytes(byte[] myByteArray) throws IOException { 
    sendBytes(myByteArray, 0, myByteArray.length); 
} 

public void sendBytes(byte[] myByteArray, int start, int len) throws IOException { 
    if (len < 0) 
     throw new IllegalArgumentException("Negative length not allowed"); 
    if (start < 0 || start >= myByteArray.length) 
     throw new IndexOutOfBoundsException("Out of bounds: " + start); 
    // Other checks if needed. 

    // May be better to save the streams in the support class; 
    // just like the socket variable. 
    OutputStream out = socket.getOutputStream(); 
    DataOutputStream dos = new DataOutputStream(out); 

    dos.writeInt(len); 
    if (len > 0) { 
     dos.write(myByteArray, start, len); 
    } 
} 

संपादित: प्राप्त करने की ओर जोड़ने के लिए:

public byte[] readBytes() throws IOException { 
    // Again, probably better to store these objects references in the support class 
    InputStream in = socket.getInputStream(); 
    DataInputStream dis = new DataInputStream(in); 

    int len = dis.readInt(); 
    byte[] data = new byte[len]; 
    if (len > 0) { 
     dis.readFully(data); 
    } 
    return data; 
} 
+0

मैं इसे कैसे लूप कर सकता हूं? जैसे इनपुट स्ट्रीम –

+0

@ क्रिस्टोफर फ्रांसिस्को लूप की प्रतीक्षा करते समय? बस एक लूप से विधियों को बुलाओ। यदि आपका मतलब है कि आपके प्रोग्राम को रोक दिए बिना किसी संदेश की प्रतीक्षा करें, तो आप केवल अलग थ्रेड पर I/O कर सकते हैं या एनआईओ का उपयोग करने के लिए इसे संशोधित कर सकते हैं। –

+0

यह परीक्षण नहीं किया है, लेकिन यदि लेन> [टीसीपी पैकेट आकार], मुझे लगता है कि readFully() सभी सामग्री लेकिन सिर्फ पहली उपलब्ध भागों नहीं पढ़ सकता है .... (https://docs.oracle.com/javase/ 7/डॉक्स/एपीआई/जावा/आईओ/डाटाइनपुट.html # readFully (बाइट [])) तो यह कोड इस मामले में काम नहीं कर सकता है, है ना? – ntg

2

The Oracle Socket Communications Tutorial उचित प्रक्षेपण केंद्र होने के लिए प्रतीत होता है।

ध्यान दें कि यह अतिरिक्त परेशानी पर जाकर वर्णों को बाइट्स में बदलने के लिए जा रहा है। यदि आप बाइट स्तर पर काम करना चाहते हैं, तो बस इसे बंद कर दें।

+1

धन्यवाद, लेकिन यह दिखाता है कि बाइट सरणी –

+0

कैसे भेजना है, क्या आप स्वयं को बाकी नहीं समझ सकते? –

1

यह Sun Sockets tutorial आप एक अच्छा प्रारंभिक बिंदु

+0

कि यह कैसे एक बाइट सरणी भेजने के लिए हालांकि –

+0

तो फिर तुम [बुनियादी आईओ] (http://java.sun.com/docs/books/tutorial/essential/io/) के बारे में जानने के लिए या कम से देखने की जरूरत है प्रदर्शित नहीं करता है केविन ब्रॉक का जवाब :) – BalusC

4

बस this exampleReally Big Index से के साथ शुरू करना चाहिए। हालांकि, ध्यान दें कि यह अक्षरों को प्रेषित करने और प्राप्त करने के लिए डिज़ाइन किया गया है, बाइट्स नहीं। यह एक बड़ी बात है, हालांकि नहीं है - तुम सिर्फ कच्चे InputStream और OutputStream वस्तुओं कि Socket वर्ग प्रदान करता है के साथ सौदा कर सकते हैं। विभिन्न प्रकार के पाठकों, लेखकों और धाराओं के बारे में अधिक जानकारी के लिए एपीआई देखें। जिन तरीकों में आप रुचि रखते हैं वे OutputStream.write(byte[]) और InputStream.read(byte[]) हैं।

1

आप उपयोग करना क्या जरूरत है एक java.io.OutputStream की write विधि, और एक java.io.InputStream की read विधि, जो दोनों के आप Socket आप खोलने से वापस पा सकते है। जावा में

0

मेरा अनुमान है कि इस सवाल का गलत तरीके से शब्दों में है। मैं जब क्यों InputStream और OutputStream के अपने प्रयोग लग रहा था मूल्य 0. की एक बाइट का सामना पर 0 करने के लिए पूरे सरणी की स्थापना किए जाने की इन मान है कि बाइट्स मान्य ASCII और बाइनरी नहीं होते हैं एक जवाब के लिए खोज इस पाया। चूंकि सवाल सही नहीं हुआ है और यह पूछता है, और किसी और ने इसे एक संभावना के रूप में पकड़ा नहीं है, मुझे लगता है कि मुझे अपनी खोज को कहीं और संतुष्ट करना होगा।

जो मैं करने की कोशिश कर रहा था वह एक पारदर्शी सॉकेट क्लास लिखना था जो डेटागैप पैकेट को पारदर्शी रूप से उपयोग करने के लिए या तो एक टीसीपी (सॉकेट/सर्वरसेट) या यूडीपी (डेटाग्राम सॉकेट) को तत्काल कर सकता है। यह यूडीपी के लिए काम करता है, लेकिन टीसीपी के लिए (अभी तक) नहीं।

फ़ॉलो-अप: मैं पुष्टि कर ली है कि ये धाराओं खुद को बाइनरी स्थानान्तरण के लिए बेकार हैं लगता है, लेकिन वे एक अधिक प्रोग्रामर के अनुकूल इन्स्टेन्शियशन को पारित किया जा सकता है कि, उदाहरण के लिए,

नई DataOutputStream (socket.getOutputStream()) writeInt (5)।

^तो उस विचार के लिए ज्यादा। यह एक "पोर्टेबल" जिस तरह से, जैसे कि, शायद ASCII, जिस पर सभी कोई मदद नहीं है में डेटा लिखते हैं, खासकर जब सॉफ्टवेयर की नकल है जिस पर मैं कोई नियंत्रण नहीं!

1

मैं ObjectOutputStream और ObjectInputStream उपयोग करने के लिए आप से पूछना होगा। ये सब कुछ एक वस्तु के रूप में भेजते हैं और उसी के रूप में प्राप्त करते हैं।

ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream()); 
os.flush(); 
ObjectInputStream is = new ObjectInputStream(socket.getInputStream()); 
os.writeObject(byte_array_that_you_want_to_send); 
byte[] temp = (byte[]) is.readObject(); 

इसके अलावा पहले, उत्पादन स्ट्रीम बनाने यह फ्लश और फिर इनपुट धारा के साथ आगे बढ़ो क्योंकि अगर कुछ धारा में बाहर छोड़ दिया इनपुट धारा अभ्यस्त बनाया जा याद है।

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

public class ByteSocketClient 
{ 
    public static void main(String[] args) throws UnknownHostException, IOException 
    { 
     Socket s=new Socket("",6000); 

     DataOutputStream dout=new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); 

     byte[] a = {(byte)0xC0,(byte)0xA8,(byte)0x01,(byte)0x02,(byte)0x53,(byte)0x4D,(byte)0x41,(byte)0x52,(byte)0x54}; 
     dout.write(a); 
     dout.close(); 
     s.close(); 
    } 

} 
+0

ओपी को "इसे आजमाएं" क्यों चाहिए? एक ** अच्छा उत्तर ** हमेशा क्या किया गया था इसका स्पष्टीकरण होगा और यह ओपी के लिए क्यों नहीं बल्कि भविष्य के आगंतुकों के लिए ऐसा किया गया था, जो इस प्रश्न को पा सकते हैं और आपका उत्तर पढ़ रहे हैं। –

0

यहां एक उदाहरण है जो एक समय में 100 बाइट WAV फ़ाइल फ्रेम स्ट्रीम करता है।

private Socket socket; 

public void streamWav(byte[] myByteArray, int start, int len) throws IOException { 

    Path path = Paths.get("path/to/file.wav"); 

    byte[] data = Files.readAllBytes(path); 

    OutputStream out = socket.getOutputStream(); 
    DataOutputStream os = new DataOutputStream(out); 

    os.writeInt(len); 
    if (len > 0) { 
     os.write(data, start, len); 
    } 
} 

public void readWav() throws IOException { 

    InputStream in = socket.getInputStream(); 

    int frameLength = 100; // use useful number of bytes 

    int input; 
    boolean active = true; 

    while(active) { 
     byte[] frame = new byte[frameLength]; 
     for(int i=0; i<frameLength; i++) { 

      input = in.read(); 

      if(input < 0) { 
       active = false; 
       break; 
      } else frame[i] = (byte) input; 
     } 

     // playWavPiece(frame); 
     // streamed frame byte array is full 
     // use it here ;-) 
    } 
} 
संबंधित मुद्दे