2012-05-16 78 views
2

我正在使用WebSockets作爲Node.js服務器和我的客戶端JS代碼之間的連接。WebSocket JavaScript:發送複雜對象

我想通過套接字發送多種不同的媒體類型(文本,音頻,視頻,圖像)。 這當然不難。 message.data instanceof Blob將文本從媒體文件中分離出來。問題是,我想爲這些媒體文件添加幾個附加屬性。

F.e:圖像 的圖像

  • 名稱的

    • 尺寸。 。 。

    現在我可以用文本形式發送一條包含這些信息的消息,並用包含blob的另一條消息跟蹤它。 我就非常喜歡,雖然,才能夠建立一個對象:

    imageObject = { 
    
    xDimension : '50px', 
    
    yDimension : '50px', 
    
    name : 'PinkFlowers.jpg' 
    
    imageData : fs.readFileSync(".resources/images/PinkFlowers.jpg") 
    
    } 
    

    而且因爲它是通過socket.send(imageObject)發送此對象。

    到目前爲止好,這實際上工作,但我如何收集對象,並使其字段再次在客戶端訪問?

    我一直在篡改它一段時間,我會很感激任何想法。

    最好的問候,

  • 回答

    4

    好吧,我沒有得到它使用Base64工作。

    在服務器端,我運行這段代碼:

    var imageObject = newMessageObject('img', 'flower.png'); 
    imageObject.image = new Buffer(fs.readFileSync('./resources/images/flower.png'), 'binary').toString('base64'); 
    imageObject.datatype = 'png'; 
    connection.send(JSON.stringify(imageObject)); 
    

    新的緩衝區()是必要的,以確保有效的UTF編碼。如果沒有使用,Chrome(不知道Firefox和其他)會引發錯誤,檢測到無效的utf8編碼並在JSON.parse(消息)後關閉執行。 注意:newMessageObject只是一個對象構造方法,它有兩個字段,我使用的類型和名稱。

    在客戶端,它真的直截了當:

    websocketConnection.onmessage = function(evt) { 
        var message = JSON.parse(evt.data); 
        ... // Some app specific stuff 
        var image = new Image(); 
        image.onload = function() { 
        canvas.getContext("2d").drawImage(image, 0, 0); 
        } 
    
        image.src = "data:image/" + message.datatype + ";base64," + message.image; 
    
    } 
    

    此畫在畫布上的圖像。

    我不相信,這是可行的音頻或視頻文件,但對於它的圖像它的工作。 我可能會回到簡單地發送混淆的URL而不是音頻/視頻數據,並直接從服務器讀取文件。雖然我不喜歡安全含義。