Android TCP 정지점 업로드 배경 C\#서비스 수신 실현
인터넷 에서 일부 자 료 를 찾 았 는데 대부분이 정지점 에서 다운로드 한 다음 에 단독 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 + " !");
}
주요 원 리 는 단점 위치 에서 업로드 하고 받 는 것 이다. 여 기 는 가장 주요 한 코드 기능 만 말 했 을 뿐 세부 적 인 처리 도 많이 있 습 니 다.예 를 들 어 터미널 에서 진 도 를 표시 해 야 하기 때문에 진 도 를 저장 해 야 합 니 다.백 엔 드 파일 의 저장 이 잘못 되 었 는 지,그리고 여러 파일 업로드 가 어 지 럽 지 않 을 지,다 중 클 라 이언 트 업로드 가 새로운 스 레 드 를 만 드 는 지,스 레 드 풀 을 만 드 는 지 등 이 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.