今天我用 java 写了一个 Android 手机 客户端 向 服务器 发送文件的小程序。
大致的步骤是
用 FileInputStream 读取 文件信息
,将 FileInputSTream 的数据 写入一个 byte[ ] 里。
把 byte[ ]的数据 write 到一个 DataOutputStream里,
然后透过 socket 把 DataOutputStream flush 出去,让 server socket 接收后解码输出文件。。
但奇怪的是,我在进行 第二步时 发现 FilieInputStream.read() 返回的数值总是为 -1
首先,我确定 文件的路径是没错的,文件确实存在。
第二,要发送的是一个 3gp 格式的音频文件,为了确定文件路径没错,我特地用一个 MediaPlayer的方法读取了该文件,确定播放成功。。。(代码中的chatting.audioPlay(Path)便是播放 这个文件的方法。。Path是文件的路径。)
以下是客户端的代码。。烦请协助查找错漏
首先在某一个activity中新建FileTransfer 类(继承Thread),并调用 构造函数,开始发送 录音文件。
FileTransfer upload=new FileTransfer(path, "192.168.0.117", 1314);
upload.start();
//path是文件路径,
"1921680.117", "1314"是 服务器IP 和 端口,确定连接正常。
、///、以下是 FileTransfer类及 构造方法 的 源码。
package com.example.start;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.net.Socket;
import com.example.english.chatting;
import android.util.Log;
public class FileTransfer extends Thread {
int read;
Socket sk;
FileInputStream fis;
DataOutputStream dataOut;
public static String hostIP;
public static int Port;
public static String Path;
byte[] fileByte=null;
public void run(){
Log.i("11", "sock start");
fileByte=new byte[1024];
// chatting.audioPlay(Path);
//这是我用于测试 路径是否正确的 方法,实现播放 Path路径所指向的 3gp音频文件,试验证明//播放成功,
try{
sk=new Socket(hostIP,Port);
OutputStream skgos=sk.getOutputStream();
dataOut=new DataOutputStream(skgos);
try
{ File file=new File(Path);
fis=new FileInputStream(file);
}catch(FileNotFoundException e){Log.v("",e.toString());}
//此处特地把 FileInputStream放到一个 try里执行,为了捕捉 FileNotFoundException ,结果发现没有捕//捉到这个异常,证明文件路径没错
while((read=fis.read(fileByte,0,fileByte.length))!=-1);
{
Log.v("read","read"+" "+read);
//问题出在这里,当我输出 read的时候,发现其为-1
// String aa=fileByte.toString();
// String bb=new String(fileByte,0,fileByte.length);
// Log.i("aa","aa"+"" + aa);
// Log.i("bb",bb);
dataOut.write(fileByte,0,read);}
dataOut.flush();
dataOut.close();
}catch(Exception e){Log.e("sock","sock"+" "+e.toString());}
}
public FileTransfer(String Path,String hostIP,int Port)
{
this.Path=Path;
this.hostIP=hostIP;
this.Port=Port;
}
}
以下是 chatting.audioPlay( )的源码
public static void audioPlay(String path){
if(mp==null)
{mp=new MediaPlayer();Log.i("media player","build mp object ");}
try{mp.reset();
mp.setDataSource(path);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();
}catch(Exception e){Log.e("AudioPlay",e.toString());}
}
------解决思路----------------------
-1的话是文件读到头了,查看日志是否有错误信息