Socket实现文件互传(一)

本文介绍了如何使用Socket通过IO流实现Android设备与PC间的文件互传。详细讲述了读取手机文件资源的过程,包括音乐、视频、图片、文档的获取方法,并解释了如何遍历手机存储空间查找特定后缀名的文档。此外,还讨论了如何访问内部存储和SD卡的文件,以及在文件管理界面中实现目录的层级浏览和返回上一级目录的功能。
摘要由CSDN通过智能技术生成

        最近一直在做比赛的一个项目,实现客户端和PC端的文件互传,其实一开始在看到这个题目的时候,完全不知道怎么去实现,感觉一脸懵逼,后来在查阅了资料以及相关书籍后了解到可以用Socket来进行通信,通过IO流来实现文件的互传,于是开始着手写这个项目。下面来详细介绍

一.   读取手机文件资源。

要传输文件首先要有文件可传,这就要先从手机数据库中读取各种文件资源,包括音乐、视频、图片、文档、压缩包、以及应用安装包。当然我只是列举了一部分常用的,还有很多类型,但是并不是很常用,所以就没有列举出来。

1.音乐

获取手机音乐其实并不难,Android已经将这些都封装好了,手机数据库中音乐的地址是MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;所以直接在这个uri下查找就可以了。附上代码:

public Cursor loadMusic(ContentResolvercontentResolver){
       String musicSort = MediaStore.Audio.Media.TITLE;
       Cursor musicCursor = contentResolver.query(FileFragment.musicUri, null, null, null,musicSort);
       if(musicCursor != null){
           while(musicCursor.moveToNext()){
               String title =musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
               String artist =musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
               String size =musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
               String path =musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
               MediaFiles song = new MediaFiles();
               song.setFileName(title);
               song.setFileSize(size);
               song.setFilePath(path);
               song.setArtist(artist);
               musicList.add(song);
            }
        }
        return musicCursor;
}

这样就可以把手机中的音乐文件都包装成添MediaFiles对象加到musicList这个集合中了,其中MediaFiles是我写的一个文件类,包括了文件的一些常用属性,通过title获取到音乐文件的标题,artist获取的是歌手名,size表示音乐文件的大小,path为绝对路径。然后把这些信息分别赋给MediaFiles这个文件对象的对应属性。附上代码:

import android.widget.ImageView;
import java.io.File;
public class MediaFiles{
 
    public intfileImage;
    public String fileSize;
    public String fileName;
    public String artist;
    public String filePath;
    public ImageView check;
    public int count = 0;
    public boolean isFile = false;
 
    public void setFileImage(int fileImage){
       this.fileImage = fileImage;
    }
 
    public void setFileSize(String fileSize){
       this.fileSize = fileSize;
    }
 
    public void setFileName(String fileName){
       this.fileName = fileName;
    }
 
    public void setArtist(String artist){
       this.artist = artist;
    }
 
    public void setFilePath(String filePath){
       this.filePath = filePath;
    }
 
    public int getFileImage(){
        returnfileImage;
    }
 
    public String getFileSize(){
        returnfileSize;
    }
 
    public String getFileName(){
        returnfileName;
    }
 
    public String getArtist(){
        returnartist;
    }
 
    public String getFilePath(){
        returnfilePath;
}

这样获取手机的音乐资源就完成了!         附上图片


2.视频

和获取音乐资源一样,视频文件还是通过一个uri来在手机数据库中查询的。Uri videoUri =MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 所以获取视频文件就照猫画虎了。附上代码:

public Cursor loadVideo(ContentResolvercontentResolver){
       String videoSort = MediaStore.Video.Media.DISPLAY_NAME;
       Cursor videoCursor = contentResolver.query(FileFragment.videoUri, null, null, null,videoSort);
       if(videoCursor != null){
           while(videoCursor.moveToNext()){
               String title = videoCursor.getString(videoCursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME));
               String size =videoCursor.getString(videoCursor.getColumnIndex(MediaStore.Video.Media.SIZE));
               String path = videoCursor.getString(videoCursor.getColumnIndex(MediaStore.Video.Media.DATA));
               MediaFiles video
在 Qt 中,可以使用 QTcpSocket实现 TCP 协议通信。要实现文件互传,可以将文件数据转换为字节流,然后通过 TCP 连接发送给对方。以下是一个简单的示例代码: ```cpp // 发送文件 QTcpSocket socket; socket.connectToHost("192.168.1.100", 8888); // 连接到目标主机的 IP 地址和端口号 if (socket.waitForConnected()) { QFile file("test.txt"); if (file.open(QIODevice::ReadOnly)) { QByteArray bytes = file.readAll(); // 将文件数据读取到字节数组中 qint64 size = bytes.size(); // 文件大小 QByteArray sizeBytes = QByteArray::number(size); // 文件大小转为字符串形式 // 先将文件大小发送给对方 socket.write(sizeBytes); socket.flush(); // 再发送文件数据 qint64 bytesSent = 0; while (bytesSent < size) { bytesSent += socket.write(bytes.mid(bytesSent)); socket.flush(); } file.close(); } } // 接收文件 QTcpServer server; server.listen(QHostAddress::Any, 8888); if (server.isListening()) { QTcpSocket *socket = server.nextPendingConnection(); // 接收到客户端连接 QByteArray sizeBytes = socket->readAll(); // 先读取文件大小 qint64 size = sizeBytes.toLongLong(); QByteArray bytes; // 循环接收文件数据 while (bytes.size() < size) { bytes.append(socket->readAll()); } QFile file("test.txt"); if (file.open(QIODevice::WriteOnly)) { file.write(bytes); // 将接收到的文件数据写入文件 file.close(); } } ``` 注意:以上代码仅为示例,实际应用中需要考虑更多的错误处理和异常情况。例如,文件可能过大导致内存不足,网络连接可能中断,等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值