文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android中使用Socket怎么实现文件断点上传功能

2023-05-31 11:47

关注

今天就跟大家聊聊有关Android中使用Socket怎么实现文件断点上传功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

什么是Socket

所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信连的句柄,应用程序通常通过“套接字”向网络发送请求或者应答网络请求,它就是网络通信过程中端点的抽象表示。它主要包括以下两个协议:

TCP (Transmission Control Protocol 传输控制协议):传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP (User Datagram Protocl 用户数据报协议):用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

详细解说如下:

TCP传输和UDP不一样,TCP传输是流式的,必须先建立连接,然后数据流沿已连接的线路(虚电路)传输。因此TCP的数据流不会像UDP数据报一样,每个数据报都要包含目标地址和端口,因为每个数据报要单独路由。TCP传输则只需要在建立连接时指定目标地址和端口就可以了。

形象的讲,TCP就像打电话,UDP就像发电报。宏观上来看UDP是不分客户端和服务端的。通信双方是平等的。微观上来讲只相对一个报文,发送端是客户端,监听端是服务端。发送端把数据报发给路由器就像把电报发给了邮局,后面的事情就是发送者无法控制,也无从知晓的了。所以说是不可靠的,可能会出现报文丢失而无从知晓。就像每张电报都要有收件人一样,每个数据报都要有目的地址和端口。

而TCP每次连接都是分客户端和服务端的。连接的发起者(相当与拨号打电话的人)是客户端,监听者(相当于在电话边等着接电话的人)是服务端。发起者指定要连接的服务器地址和端口(相当于拨号),监听者通过和发起者三次握手建立连接(相当于听到电话响去接电话)。建立连接后双方可以互相发送和接受数据(打电话)。

Java如何操作Socket?

值得一提的是,Java分别为TCP和UDP提供了相应的类,TCP是java.NET中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用起来很方便!UDP是java.Net.DatagramSocket.

127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问,端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口.

Socket通信模型如下:

Android中使用Socket怎么实现文件断点上传功能

服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

客户端,使用Java socket通信对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

TCP网络连接模型:

Android中使用Socket怎么实现文件断点上传功能

Android中使用Socket怎么实现文件断点上传功能

Android客户端程序代分析:

UploadActivity.java  

package com.android.upload; import java.io.File;  import java.io.OutputStream;  import java.io.PushbackInputStream;  import java.io.RandomAccessFile;  import java.net.Socket;    import android.app.Activity;  import android.os.Bundle;  import android.os.Environment;  import android.os.Handler;  import android.os.Message;  import android.view.View;  import android.view.View.OnClickListener; import android.widget.Button;  import android.widget.EditText;  import android.widget.ProgressBar;  import android.widget.TextView;  import android.widget.Toast;    import com.android.service.UploadLogService;  import com.android.socket.utils.StreamTool;    public class UploadActivity extends Activity {    private EditText filenameText;    private TextView resulView;    private ProgressBar uploadbar;    private UploadLogService logService;    private boolean start=true;   private Handler handler = new Handler(){      @Override      public void handleMessage(Message msg) {        int length = msg.getData().getInt("size");        uploadbar.setProgress(length);        float num = (float)uploadbar.getProgress()/(float)uploadbar.getMax();        int result = (int)(num * 100);        resulView.setText(result+ "%");        if(uploadbar.getProgress()==uploadbar.getMax()){          Toast.makeText(UploadActivity.this, R.string.success, 1).show();        }      }    };        @Override    public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.main);            logService = new UploadLogService(this);      filenameText = (EditText)this.findViewById(R.id.filename);      uploadbar = (ProgressBar) this.findViewById(R.id.uploadbar);      resulView = (TextView)this.findViewById(R.id.result);      Button button =(Button)this.findViewById(R.id.button);      Button button1 =(Button)this.findViewById(R.id.stop);      button1 .setOnClickListener(new OnClickListener() {              @Override       public void onClick(View v) {         start=false;                }     });     button.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {          start=true;         String filename = filenameText.getText().toString();          if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){            File uploadFile = new File(Environment.getExternalStorageDirectory(), filename);            if(uploadFile.exists()){              uploadFile(uploadFile);            }else{              Toast.makeText(UploadActivity.this, R.string.filenotexsit, 1).show();            }          }else{            Toast.makeText(UploadActivity.this, R.string.sdcarderror, 1).show();          }        }      });    }        private void uploadFile(final File uploadFile) {      new Thread(new Runnable() {             @Override        public void run() {          try {            uploadbar.setMax((int)uploadFile.length());            String souceid = logService.getBindId(uploadFile);            String head = "Content-Length="+ uploadFile.length() + ";filename="+ uploadFile.getName() + ";sourceid="+              (souceid==null? "" : souceid)+"\r\n";            Socket socket = new Socket("192.168.1.78",7878);            OutputStream outStream = socket.getOutputStream();            outStream.write(head.getBytes());                        PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());              String response = StreamTool.readLine(inStream);            String[] items = response.split(";");            String responseid = items[0].substring(items[0].indexOf("=")+1);            String position = items[1].substring(items[1].indexOf("=")+1);            if(souceid==null){//代表原来没有上传过此文件,往数据库添加一条绑定记录              logService.save(responseid, uploadFile);            }            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(start&&(len = fileOutStream.read(buffer)) != -1){              outStream.write(buffer, 0, len);              length += len;              Message msg = new Message();              msg.getData().putInt("size", length);              handler.sendMessage(msg);            }            fileOutStream.close();            outStream.close();            inStream.close();            socket.close();            if(length==uploadFile.length()) logService.delete(uploadFile);          } catch (Exception e) {            e.printStackTrace();          }        }      }).start();    }  }  

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯