Android TCP 정지점 업로드 배경 C\#서비스 수신 실현

단말기 가 큰 파일 업 로드 를 실현 하 는 것 은 비교적 어 려 운 기술 이다.그 중에서 백 엔 드 와 프론트 엔 드 의 상호작용,안정성 과 데이터 크기 와 관련 되 고 실현 원 리 는 모든 사람 이 자신의 생각 을 가지 고 백 엔 드 의 주 류 는 Http 로 이 루어 지 는데 대부분이 중단 점 다운 로드 를 실현 하기 때문이다.그러나 안정성 은 보장 되 지 않 고 끊 기 면 계속 전 할 수 없다.그래서 다른 유행 하 는 방법 으로 TCP 에서 큰 파일 을 업로드 해 야 합 니 다. 
인터넷 에서 일부 자 료 를 찾 았 는데 대부분이 정지점 에서 다운로드 한 다음 에 단독 C\#엔 드 의 업로드 수신 이나 HTTP 의 경우 안 드 로 이 드 만 있 었 다.작업 이 빡빡 하기 때문에 전에 찾 은 첫 번 째 방안 은 당연히 Http 가 먼저 파일 업 로드 를 실현 하고 단말 기 는 Post 방법 으로 파일 을 백 엔 드 로 직접 전송 하 며 백 엔 드 는 File 을 통 해 얻 었 다. 
android 엔 드: 

RequestParams params = new RequestParams();
 File file = getTempFile();//      
  try {
   params.put("file", file);
  } catch (FileNotFoundException e1) {
   e1.printStackTrace();
  }
  AsyncHttpUtil.post(URL + "/UpLoad", params, new JsonHttpResponseHandler() {
……

백 엔 드:
 var file = Request.Files["file"];
  file.SaveAs(upFileName);
파일 형식 을 통과 하지 않 고 다른 더 좋 은 처리 방법 도 있 습 니 다.네트워크 가 좋 은 상황 에서 문제 가 없 지만 네트워크 가 나중에 절반 이 끊 기거 나 여러 클 라 이언 트 가 업로드 되 어 연결 되 지 않 는 상황 이 발생 할 뻔 했 습 니 다.큰 파일 에 대해 매우 불안정 하기 때문에 TCP 프로 토 콜 파일 의 정지점 을 개발 하여 업로드 합 니 다.
Http 인 터 럽 트 업 로드 를 실현 한 네티즌 도 있 습 니 다.큰 파일 이 안 되면 작은 파일 로 나 누 어 올 립 니 다.순수한 NET 의 주요 방법 은 다음 과 같 습 니 다. 
업로드: 

 bool result = true;
   long cruuent = 0;

   FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
   BinaryReader bReader = new BinaryReader(fStream); 
   
   //      ,       100    
   long length = 100;

   fileName = fileName.Substring(fileName.LastIndexOf('\\') + 1);

   #region       
   try
   {

    
    byte[] data; 
    #region       
    for (; cruuent <= length; cruuent = cruuent + byteCount)
    {
     if (cruuent + byteCount > length)
     {
      data = new byte[Convert.ToInt64((length - cruuent))];
      bReader.Read(data, 0, Convert.ToInt32((length - cruuent)));
     }
     else
     {
      data = new byte[byteCount];
      bReader.Read(data, 0, byteCount);
     }
     try
     {
      Hashtable parms = new Hashtable();
      parms.Add("fileName", fileName);
      parms.Add("npos", cruuent.ToString());

      byte[] byRemoteInfo = PostData(serverPath + "UpLoadServer.aspx", data, parms);

     }
     catch (Exception ex)
     {
      msg = ex.ToString();
      result = false;
      break;
     }
    #endregion
    }
   }
   catch (Exception ex)
   {
    msg = ex.ToString();
    result = false;
   }
   finally
   {
    bReader.Close();
    fStream.Close();

   }

   GC.Collect();

먼저 파일 을 작은 흐름 으로 나 누고 npos 는 정지점 의 위치,즉 올 린 크기 로 나 눈 다음 모든 가방 을 반복 해서 업로드 합 니 다.
배경 수신: 

 /// <summary>
 ///     ( URL        、    ,            )
 ///         ,      0,         ,         
 /// </summary>
 public void SaveUpLoadFile()
 {

  string fileName = Request.Params["fileName"];
  long npos = Convert.ToInt64(Request.Params["npos"]);

  int upLoadLength = Convert.ToInt32(Request.InputStream.Length);
  
  string path = Server.MapPath("/UpLoadServer");
  fileName = path + "//UpLoad//" + fileName;

  FileStream fStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  //    
  fStream.Seek(npos, SeekOrigin.Begin);

  //             
  BinaryReader bReader = new BinaryReader(Request.InputStream);
  try
  {
   byte[] data = new byte[upLoadLength];
   bReader.Read(data, 0, upLoadLength);
   fStream.Write(data, 0, upLoadLength);
  }
  catch
  {
   //TODO       
  }
  finally
  {
   //   
   fStream.Close();
   bReader.Close();
  }
 }

fStream.Seek(npos,SeekOrigin.Begin)에 중점 을 둡 니 다.정지점 위치 에서 저장 을 받 습 니 다.
흥미 있 는 것 은 스스로 실현 할 수 있다.  
현재 클 라 이언 트 TCP 업로드,백 엔 드 TCP 수신 에 대해 서 는 안 드 로 이 드 에서 로 컬 파일 을 읽 고 파일 이름,파일 크기 를 서버 에 업로드 합 니 다(파일 이름 은 전역 에서 유일 해 야 합 니 다).서버 는 파일 이름 에 따라 업로드 여 부 를 조회 합 니 다.업로드 한 적 이 있 으 면 전 달 된 파일 의 크기 즉 정지점 위 치 를 터미널 에 전송 합 니 다.터미널 에서 받 은 후에 정지점 위 치 를 저장 합 니 다.그리고 모든 것 이 완 료 될 때 까지 정지점 위치 에서 파일 을 읽 고 계속 업로드 합 니 다.업로드 하지 않 았 다 면 서버 에서 캐 시 파일 을 만 들 고 받 습 니 다. 
코드 보기 Android: 

String head = "Length=" + uploadFile.length() + ";filename=" + filename

 Socket socket = new Socket("192.168.0.123", 7080);
     OutputStream outStream = socket.getOutputStream();
     outStream.write(head.getBytes());//  

     PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());
     String response = StreamTool.readLine(inStream);//  
     String[] items = response.split(";");

 final String position = items[0].substring(items[0].indexOf("=") + 1);//    
      final String serviceurl = items[1].substring(items[1].indexOf("=") + 1);//        

RandomAccessFile fileOutStream = new RandomAccessFile(uploadFile, "r");
      fileOutStream.seek(Integer.valueOf(position));//           
      byte[] buffer = new byte[1024];
      int len = -1;
      int length = Integer.valueOf(position);//       ,      
      while ( (len = fileOutStream.read(buffer)) != -1) {
       outStream.write(buffer, 0, len);
       length += len;
       Message msg = new Message();
       msg.getData().putInt("size", length);
       //               handler.sendMessage(msg);

      } if (length == uploadFile.length()) {//    ,       } fileOutStream.close(); outStream.close(); inStream.close(); socket.close(); 

백 엔 드 처리: 

 private static TcpListener listener;//     
 IPAddress ipHost = IPAddress.Any;
 listener = new TcpListener(ipHost, 7080);
     listener.Start();//    

 Socket remoteSocketClient = listener.AcceptSocket();
     device = new Device(remoteSocketClient);
//         
     threaddev = new Thread(new ThreadStart(device.Scan));
     device.curentThread = threaddev;
     threaddev.IsBackground = true;
     threaddev.Start();

Scan 처리 방법:

string[] items = strGetContent.Split(';');
     string filelength = items[0].Substring(items[0].IndexOf("=") + 1);
     string filename = items[1].Substring(items[1].IndexOf("=") + 1);
 //        
       filePath = Path.Combine(directoryPath, filename);
//    
      long position = 0;
      if (File.Exists(filePath))
      {
       using (FileStream reader = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
       {
        position = reader.Length;
       }
      }
//    
 response = "position=" + position + ";serviceurl=" + dirPath + "/" + filename) ;
      

      //              ,          :;position=0 
      //serviceurl            /PlayFiles/video/2016/07/04/1141142221.mp4
      bufferSend = Encoding.UTF8.GetBytes(response);
      remoteSocketClient.Send(bufferSend);

그리고 속보 내용 처리 하기:

//      
      byte[] buffer = new byte[BufferSize];
      int received = 0;
      long receive, length = long.Parse(filelength);
      FileInfo file = new FileInfo(filePath);
      using (FileStream writer = file.Open(file.Exists ? FileMode.Append : FileMode.CreateNew, FileAccess.Write, FileShare.None))
      {
       receive = writer.Length;
       while (receive < length)
       {
        if ((received = remoteSocketClient.Receive(buffer)) == 0)
        {
         Program.MessageAdd(" IP【" + remoteSocketClient.RemoteEndPoint.ToString() + "】    !");
         break;
        }
        writer.Write(buffer, 0, received);
        writer.Flush();
        receive += (long)received;
       }

      }

if (receive == length)
      {
       Program.MessageAdd(" IP【" + remoteSocketClient.RemoteEndPoint.ToString() + "】  " + filename + "  !");
}
주요 원 리 는 단점 위치 에서 업로드 하고 받 는 것 이다. 
여 기 는 가장 주요 한 코드 기능 만 말 했 을 뿐 세부 적 인 처리 도 많이 있 습 니 다.예 를 들 어 터미널 에서 진 도 를 표시 해 야 하기 때문에 진 도 를 저장 해 야 합 니 다.백 엔 드 파일 의 저장 이 잘못 되 었 는 지,그리고 여러 파일 업로드 가 어 지 럽 지 않 을 지,다 중 클 라 이언 트 업로드 가 새로운 스 레 드 를 만 드 는 지,스 레 드 풀 을 만 드 는 지 등 이 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기