感觉自己对于网络传输的问题一直很困惑。网上查阅的资料也不是自己想要的,所以只好到这里来求大神帮助!
最近在做聊天室,客户端是android,我自己在本地搭了workerman当做服务器。两边都是采用websocket协议。
我用inputstream读取txt文件通过websocket发送到服务器,服务器接受到数据后写入txt文件。这时txt文件正常能够打开。
现在我用同样的方法读取android录音出来的.amr文件发送到服务器并写入.amr文件中,会出现文件损坏无法打开的问题。
基于此,感觉自己平时只注重软件功能的实现而不注重计算机原理的弊端出现了。出现了一些自己也觉得很幼稚的问题:
1:网络之间是如何传输数据的?
我将音频文件读取出来转换成二进制传输到服务端,服务端怎么将这些二进制恢复成原来的文件呢?
2:如何解决上面说的文件损坏无法打开的问题?
还是说我的理解一开始就是错的,感觉将音频文件读取出来就是不行?而应该用什么方法将音频文件进行转换才能传送呢?
客户端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[1024];
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();
}
}
}
服务端代码:
$worker->onMessage = function($connection, $data)
{
$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 "写入模板失败!";
}
};