Android之Socket文件及消息传输

socket传输文件时,只能通过流去读取消息。当socket接收文件、消息等不同的数据时,如何区别是字符串还是流是很重要的。为了保证接收到的数据类型统一(数据是字符串还是流),需要定义协议。定义协议的方式有很多种:1.发送一个握手信号。 根据握手信号来确定发送的是字符串还是流2.定义了Header(头)和Body(实体),头是固定大小的,用来告诉接收者数据的格式、用途、长度等信息,接收者根...
摘要由CSDN通过智能技术生成

socket传输文件时,只能通过流去读取消息。当socket接收文件、消息等不同的数据时,如何区别是字符串还是流是很重要的。为了保证接收到的数据类型统一(数据是字符串还是流),需要定义协议。定义协议的方式有很多种:

1.发送一个握手信号。 根据握手信号来确定发送的是字符串还是流

2.定义了Header(头)和Body(实体),头是固定大小的,用来告诉接收者数据的格式、用途、长度等信息,接收者根据Header     来接受Body。

3.自定义协议。

这里采用自定义协议,统一传输JSON数据,根据字段标识传输的是字符串还是流,接收者根据标识去解析数据即可。

协议的实体类(Transmission):


public class Transmission implements Parcelable {
    /**
     * 文件名称
     */
    public String fileName;

    /**
     *文件长度
     */
    public long fileLength;

    /**
     *传输类型
     */
    public int transmissionType;

    /**
     *传输内容
     */
    public String content;

    /**
     *传输长度
     */
    public long transLength;

    public Transmission(){

    }

    protected Transmission(Parcel in){
        this.fileName = in.readString();
        this.fileLength = in.readLong();
        this.transmissionType = in.readInt();
        this.content = in.readString();
        this.transLength = in.readLong();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.fileName);
        dest.writeLong(this.fileLength);
        dest.writeInt(this.transmissionType);
        dest.writeString(this.content);
        dest.writeLong(this.transLength);
    }

    public static final Creator<Transmission> CREATOR = new Creator<Transmission>() {
        @Override
        public Transmission createFromParcel(Parcel in) {
            return new Transmission(in);
        }

        @Override
        public Transmission[] newArray(int size) {
            return new Transmission[size];
        }
    };
}

根据字段transmissionType去标识传输(序列化)或者接收(发序列化)的类型。传输的过程中始终都是以JSON的格式存在的。在传输文件时需要把流转换成字符串(Base64加密与解密)。

客户端(ClientThread)

public class RemoteClientSocket extends Thread {
    private Gson mGson;
    private PrintWriter mPrintWriter;
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android提供了Socket编程接口,可以实现文件传输。在进行文件传输之前,需要确保客户端和服务端的Socket已经建立连接。下面是一个简单的示例代码: 服务端代码: ```java try { ServerSocket serverSocket = new ServerSocket(8888); Socket clientSocket = serverSocket.accept(); File file = new File("path_to_file"); // 待传输文件路径 FileInputStream fileIn = new FileInputStream(file); OutputStream out = clientSocket.getOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fileIn.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } fileIn.close(); out.close(); clientSocket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } ``` 客户端代码: ```java try { Socket socket = new Socket("server_ip_address", 8888); InputStream in = socket.getInputStream(); FileOutputStream fileOut = new FileOutputStream("destination_path"); // 接收文件的保存路径 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { fileOut.write(buffer, 0, bytesRead); } in.close(); fileOut.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } ``` 通过上述代码,服务器监听指定端口的连接请求并接受连接,将待传输文件的数据通过OutputStream写入Socket输出流给客户端;客户端通过Socket连接服务器,并将Socket输入流的数据写入到文件输出流中,保存到指定路径。 需要注意的是,上述代码只是简单示例,实际使用时需要进行错误处理、断点传输等逻辑的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值