2013-01-05 7 views
5

का उपयोग कर सॉकेट से कैसे पढ़ा जाए, मैं एक एकल छवि प्राप्त कर सकता हूं, लेकिन अब मैं अपनी डिस्क पर एकाधिक छवियां प्राप्त करना और लिखना चाहता हूं जो हर 5 सेकंड के बाद एंड्रॉइड क्लाइंट से भेजे जाएंगे।datainputstream

Socket sock = servsock.accept(); 
dataInputStream = new DataInputStream(sock.getInputStream()); 
dataOutputStream = new DataOutputStream(sock.getOutputStream()); 
System.out.println("Accepted connection : " + sock); 

dataInputStream = new DataInputStream(sock.getInputStream()); 

byte[] base64=dataInputStream.readUTF().getBytes(); 

byte[] arr=Base64.decodeBase64(base64); 

FileOutputStream imageOutFile = new FileOutputStream("E:\\image.jpeg"); 
imageOutFile.write(arr); 

उत्तर

3

आप अपने ग्राहक और सर्वर के बीच एक प्रोटोकॉल का निर्माण करने की आवश्यकता होगी।

यदि छवि का आकार स्थिर है तो आपको केवल इनपुट-स्ट्रीम पर लूप करना होगा और जब तक आप बाइट्स की निश्चित संख्या प्राप्त नहीं कर लेते हैं और सभी पहले से ही buffered छवि लिखते हैं तो बफरिंग करना होगा।

अन्यथा आपको कुछ मेटाडाटा छवियों के आकार को इंगित करने की आवश्यकता होगी; जैसे साथ

[size1][image1][size2][image2][size3][image3] 

[आकार-मैं] अंतरिक्ष की एक निश्चित राशि और कब्जे [छवि मैं] ith छवि का आकार: आप इस तरह एक साधारण स्वरूप का उपयोग कर सकते हैं।

लेकिन सभी के ऊपर एक छवि को संसाधित करने, 5 सेकंड सोते हुए और अगले को पुनर्प्राप्त करने के लिए इस तरह के एक निष्क्रिय प्रोटोकॉल करने का लुत्फ उठाना नहीं है क्योंकि क्लाइंट, नेटवर्क या सर्वर के कारण सटीक समय प्रत्येक छवि के बीच बहुत भिन्न हो सकता है (आपका कोड और/या फ़ाइल-सिस्टम)।

2

लिटिल परिवर्तन:

Socket sock = servsock.accept(); 
dataInputStream = new DataInputStream(sock.getInputStream()); 
dataOutputStream = new DataOutputStream(sock.getOutputStream()); 
System.out.println("Accepted connection : " + sock); 

int imagesCount = dataInputStream.readInt(); 
for (int imgNum = 0; imgNum < imagesCount; imgNum++) { 
    int imgLen = dataInputStream.readInt(); 
    byte[] base64 = new byte[imgLen]; 
    dataInputStream.readFully(base64); 

    byte[] arr = Base64.decodeBase64(base64); 

    FileOutputStream imageOutFile = new FileOutputStream("E:\\image"+imgNum+".jpeg"); 
    imageOutFile.write(arr); 
} 
+1

वीजी लेकिन मैं बेस 64 एन्कोडिंग से छुटकारा पाउंगा और केवल DataInputStream.readFully() का उपयोग करूंगा। – EJP

+1

इस मामले में ... 'के लिए (.....) { int imgLen = dataInputStream.readInt(); बाइट [] arr = new बाइट [imgLen]; dataInputStream.readFully (arr); // [... कटौती ...] ' – ggrandes

+0

मैं" मुख्य "java.lang.OutOfMemoryError धागा में इस त्रुटि अपवाद हो रही है: जावा ढेर अंतरिक्ष \t server.main पर (server.java:52) –

0

आप एक से अधिक ग्राहकों और एक ही सर्वर हो रही है। बहु थ्रेडिंग आज़माएं। कोड का नमूना टुकड़ा:

public static void main(String[] args){ 
    try { 
     servSocket = new ServerSocket(xxxx); 

     while(true) 
     { 

      socket = servSocket.accept(); 

      ClientNum++; 

      for(int i=0;i<10;i++){ //this for eg accepts 10 clients, with each client assigned an ID. 

       if(threads[i]==null){ 
        sockets[i]=socket; 

अपने "रन" में, आप अपने-अपने आईडी के आधार पर इन ग्राहकों में से प्रत्येक फोन और reqd समारोह आप की जरूरत प्रदर्शन कर सकते हैं। यह सुनिश्चित नहीं है कि यह कितना स्पष्ट है। यदि आवश्यक हो, तो मैं आपको वह पूरा कोड भेज सकता हूं जो आपके पास है जो आप कर रहे हैं।

संबंधित मुद्दे