2013-01-05 25 views
5

讀我可以顯示一個圖像接收,但是現在我想接收並寫我的磁盤上的多張圖片,將來自Android客戶端每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

你需要建立你的客戶端和服務器之間的協議

如果圖像尺寸是恆定的,你只需要循環輸入流,並保持緩衝,直到你得到字節固定數量和寫入所有已緩存的圖像。

否則,您需要添加一些指示圖像大小的元數據;例如你可以使用一個簡單的格式是這樣的:

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

與[大小-1]佔據空間的固定量和[圖像-1]的第i個圖像的大小。

但最重要的是不要試圖做一個像處理圖像,睡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

VG但我想擺脫的base64編碼的,只是使用DataInputStream.readFully()。 – EJP

+1

在這種情況下... '爲(.....){ INT imgLen = dataInputStream.readInt(); 字節[] ARR =新的字節[imgLen]; dataInputStream.readFully(arr); // [... cut ...]' – ggrandes

+0

我在線程「main」java.lang.OutOfMemoryError中收到此錯誤異常:Java堆空間 \t at 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; 

在你的「運行」,你可以通過它們各自的ID叫這些客戶並執行REQD功能需要。不知道這有多清楚。如果需要,我可以向您發送我所擁有的與您正在做的有點相似的完整代碼。