国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

android與workerman 數(shù)據(jù)傳輸問題

ycsi

我在android客戶端通過inputstream讀取音頻文件,通過websocket發(fā)送二進(jìn)制流,請問服務(wù)器端的同樣websocket協(xié)議的workerman服務(wù)端怎么將接受到的數(shù)據(jù)轉(zhuǎn)化為音頻文件呢?

9473 6 0
6個回答

walkor 打賞

websocket向服務(wù)端傳輸二進(jìn)制時,需要在js中設(shè)置binaryType屬性為arraybuffer。這個是瀏覽器websocket協(xié)議的規(guī)則。安卓的websocket庫應(yīng)該也要遵守這個規(guī)則,看下是否有設(shè)置binaryType的接口

ws = new WebSocket("ws://....");
ws.binaryType = "arraybuffer";
.....

同樣,服務(wù)端如果要向客戶端通過websocket發(fā)送二進(jìn)制數(shù)據(jù),需要設(shè)置服務(wù)端的binaryType,瀏覽器才能正常解析。不設(shè)置默認(rèn)是utf8文本格式傳輸。

use \Workerman\Protocols\Websocket;
// 默認(rèn)值是 Websocket::BINARY_TYPE_BLOB; 也就是以utf8傳輸,根據(jù)需要可設(shè)置成二進(jìn)制:BINARY_TYPE_ARRAYBUFFER
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;

  • 暫無評論
ycsi

我客戶端用的是atudobahn庫,里面沒有binaryType的屬性,有sendBinaryMessage()的方法。下面是源代碼:

android客戶端:

 mConnection.connect(wsuri, new WebSocketHandler() {

@Override
public void onOpen() {
    Log.d(TAG, "Status: Connected to " + wsuri);                           
    InputStream is = null;
    try {
        is = new FileInputStream(_file);
         } catch (FileNotFoundException e) {
        e.printStackTrace();
         }

    byte[] bytes = new byte;
    int len = 0;

    try {
        while((len=is.read(bytes))!=-1)
            {
                Log.d(TAG, "senBinaryMessage: " + bytes);
                mConnection.sendBinaryMessage(bytes);
            }
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

服務(wù)器端:

$worker->onMessage = function($connection, $data)
{
    echo "$data\n\n\n";

    $filePath="/Users/myname/Desktop/php/";
    if (!file_exists($filePath)){
        mkdir($filePath , 0777);
    }

    $name=$filePath.'voice'.'.amr';
    $fp = fopen ($name,"a");

    if (fwrite ($fp,$data)){
        echo "寫入成功";
    } else {
        fclose ($fp);
        echo "寫入失敗!";
    }

};

傳txt文件沒問題(我把$name=$filePath.'voice'.'.amr';改成$name=$filePath.'voice'.'.txt';)

但是傳amr的時候會出現(xiàn)文件損壞無法打開的問題。

  • 暫無評論
walkor 打賞

服務(wù)端要以追加的方式寫文件。不然數(shù)據(jù)就寫亂了

簡單的方法是用 file_put_contents 寫數(shù)據(jù)

  • 暫無評論
ycsi

現(xiàn)在可以傳音頻文件了。但是傳圖片的話,圖片不壓縮會傳不了,連接會被關(guān)閉,websocket的send方法有限制傳輸二進(jìn)制流的大小嗎?

服務(wù)器代碼:

Bitmap btp = BitmapFactory.decodeStream(inputStream); 
ByteArrayOutputStream baos = new ByteArrayOutputStream();    
btp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
mConnection.sendBinaryMessage(baos.toByteArray());

客戶端代碼:

$worker->onConnect = function($connection)
{
    echo "new connection from ip " . $connection->getRemoteIp() . "\n";

};

$worker->onMessage = function($connection, $data)
{
    var_dump($data);

    file_put_contents("/Users/myname/Desktop/php/test.jpg",$data);
    $connection->send('receive success');
};

$worker->onClose = function($connection)
{
    echo "connection closed\n";
};

服務(wù)器還是會返回:

new connection from ip 192.168.0.3
connection closed

但是我把客戶端的壓縮率改一下
btp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
把100改成0-3的值,手機拍攝的照片就能傳,大于3就傳不了圖片。。結(jié)果圖片嚴(yán)重失真。

另外十分感謝您之前能夠耐心回答我的問題!謝謝!

  • 暫無評論
walkor 打賞

圖片多少字節(jié)?

  • 暫無評論
ycsi

圖片1M左右的,網(wǎng)上找了一個不錯的壓縮圖片的方法,把圖片壓縮到100kb以內(nèi)就很好傳啦~

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??