2012-12-29 41 views
-1

你能來看看在這個?:傳輸Java對象,字節[]

這是我的客戶:

try { 
     Socket socket = new Socket("127.0.0.1", 3000); 
     OutputStream out = socket.getOutputStream(); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(mp3data); 
     oos.close(); 

     byte[] bytes = baos.toByteArray(); 
     out.write(bytes); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

這是我的服務器:

int port = 3000; 
     try { 
     ServerSocket clientConnect = new ServerSocket(port); 
     System.out.println("SimpleServer running on port" + port); 
     Socket clientSock = clientConnect.accept(); 
     InputStream is = clientSock.getInputStream(); 


    byte[] buffer = new byte[1024]; 
    int read = is.read(buffer); 

    ObjectInputStream ois = new ObjectInputStream(is); 
    MP3[] songs = (MP3[])ois.readObject(); 

    clientSock.close(); 

    // HTML erzeugen 
    Website site = new Website("index2.html",songs); 

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

它不工作。我沒有得到任何例外,但網站構造函數沒有被調用。

+0

您已經調試過嗎? – burna

+1

你應該在客戶端的'out.write()'之後''out.flush()'。另外,在服務器端,您定義了一個尺寸僅爲1024字節的緩衝區,我懷疑它能夠接收到您希望接收的內容,除非我誤認爲... – fge

+1

http://codereview.stackexchange.com/是更好的地方問這樣的問題 –

回答

1

您假定整個字節數組只讀取一次,並調用read(),長度恰好爲1024字節。事實並非如此(除非你非常幸運)。此外,您的ObjectInputStream正在封裝已經讀取構成消息的字節(或一些字節)的InputStream。而且,發件人寫入的字節也不會被刷新。

不要忽略調用is.read()的結果:它會告訴您實際上已讀取了多少個字節。直到它不是-1,你應該繼續閱讀,在一個循環。

閱讀關於byte streams的Java教程。

這就是說,你讓事情變得困難。爲什麼不直接將對象寫入套接字輸出流,並直接從另一側的套接字輸入流中讀取對象?

+0

明天我會解決它。感謝您的回答,也許那時我有另一個問題。 – alex

+0

好吧,我已經這樣做了,但我認爲某處是另一個語法錯誤。 – alex

0
int port = 3000; 
     try { 
     ServerSocket clientConnect = new ServerSocket(port); 
     System.out.println("SimpleServer running on port" + port); 
     Socket clientSock = clientConnect.accept(); 
     InputStream is = clientSock.getInputStream(); 

     byte[] buffer = new byte[1024]; 

     for (int i = 0; i < buffer.length; i++) { 
      int b = is.read(); 
      if (b ==-1) break; 
      buffer[i] = (byte) b; 
     } 

     ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer)); 
     MP3[] songs = (MP3[])ois.readObject();; 
     ois.close(); 

     clientSock.close();