软件编程
位置:首页>> 软件编程>> Android编程>> Android 通过TCP协议上传指定目录文件的方法

Android 通过TCP协议上传指定目录文件的方法

作者:祥子Gyx  发布时间:2023-11-07 23:34:11 

标签:android,tcp协议,上传

为了方便客户抓取Log,现通过TCP协议连接指定服务器,传输指定内容,定义指定目录,IP,PORT字段接收参数。直接上代码


public static void uploadLog(final String dirPath, final String IP, final int port ) {
JSONArray fileList = new JSONArray();
final JSONArray allFiles = getAllFiles(fileList,dirPath);
if(allFiles==null)return;
new Thread(){
 @Override
 public void run() {
 super.run();
 try {
  Socket socket=new Socket(IP,port);
  if(!socket.isConnected())return; //判断是否建立连接
  OutputStream os = socket.getOutputStream();
  int index = dirPath.lastIndexOf("/")+1;
  os.write(dirPath.substring(index).getBytes());//TAG
  os.write("\r\n".getBytes());

for (int i=0;i<allFiles.length();i++){
  try {
   JSONObject o = (JSONObject) allFiles.get(i);
   String path = o.getString("path");
   String name = o.getString("name");
   FileInputStream fis=new FileInputStream(path);
   if(fis!=null){
   InputStreamReader inputreader = new InputStreamReader(fis);
   BufferedReader buffreader = new BufferedReader(inputreader);
   String line;
   while ((line=buffreader.readLine())!=null){ //按行读取文件内容
    os.write(line.getBytes());
    os.write("\r\n".getBytes());//向服务器端发送文件
   }
   buffreader.close();
   inputreader.close();
   }
   fis.close();

} catch (JSONException e) {
   e.printStackTrace();
  }
  }
  //关闭客户端输出流,中断上传
  socket.shutdownOutput();
  socket.close();

} catch (IOException e) {
  e.printStackTrace();
 }
 }
}.start();

}

/**
* 获取指定目录内所有文件路径
* @param dirPath 需要查询的文件目录
*/
public static JSONArray getAllFiles(JSONArray fileList,String dirPath) {
File f = new File(dirPath);
if (!f.exists()) {//判断路径是否存在
 return null;
}
File[] files = f.listFiles();

if(files==null){//判断权限
 return null;
}
for (File _file : files) {//遍历目录
 if(_file.isFile()){

String _name=_file.getName();
 String filePath = _file.getAbsolutePath();//获取文件路径
 int end=_file.getName().lastIndexOf('.');
 String fileName = _file.getName().substring(0,end);//获取文件名
 try {
  JSONObject _fInfo = new JSONObject();
  _fInfo.put("name", fileName);
  _fInfo.put("path", filePath);
  fileList.put(_fInfo);

}catch (Exception e){
 }
 } else if(_file.isDirectory()){//查询子目录
 getAllFiles(fileList,_file.getAbsolutePath());
 } else{
 }
}
return fileList;
}

必须声明一下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

设计思路:

  1首先通过第三方应用传过来的Log路径,通过遍历该路径,得到该目录下的所有文件,保存到集合中,

  2然后通过socker建立通信,通信建立成功后开始传输日志, 

  3读取指定目录下的日志文件,解析内容传输到服务端, 

  4日志按行读取, 

  5内容头部增加TAG以区分不同应用的日志

服务端是因为有现成的软件,所以这里就不做解析了。

LogUtil.uploadLog("storage/emulated/0/C28Log/CarRecorderLog","10.0.16.252",8088);

Android 通过TCP协议上传指定目录文件的方法

来源:https://blog.csdn.net/weixin_35649059/article/details/105068257

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com