我在android客戶端通過inputstream讀取音頻文件,通過websocket發(fā)送二進(jìn)制流,請問服務(wù)器端的同樣websocket協(xié)議的workerman服務(wù)端怎么將接受到的數(shù)據(jù)轉(zhuǎn)化為音頻文件呢?
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;
我客戶端用的是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)文件損壞無法打開的問題。
現(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)重失真。
另外十分感謝您之前能夠耐心回答我的問題!謝謝!