《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 37285|回复: 282
收起左侧

[基础] [原创]局域网下使用MATLAB传送文件

    [复制链接]
发表于 2012-7-24 20:38:47 | 显示全部楼层 |阅读模式
本帖最后由 baby_wolf 于 2012-7-24 20:39 编辑




本程序的功能是用MATLAB接收和传送文件。要求两台电脑都连接到了同一个路由器(即位于同一局域网中),并都安装有matlab软件。程序分成两个文件sendfile.m和getfile.m。发送端电脑使用sendfile.m发送文件,接收端电脑使用getfile.m接收文件。


举例
第一步,发送端电脑执行:
  1. ip   
复制代码
第二步,发送端电脑执行:
  1. sendfile
复制代码
选择好要传送的文件之后,在接收端执行第三步。

第三步,接收端电脑输入,注意接收端电脑接收文件时需要知道发送端的IP地址
  1. getfile('192.168.2.100');
复制代码
源程序代码:
  1. function ip
  2. %功能:获取电脑IP地址。
  3. [s r]=system('ipconfig');
  4. r=regexp(r,'IP Address. . . . . . . . . . . . : \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','match');
  5. r=r{1};
  6. r=regexp(r,'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','match');
  7. lip=r{1};
  8. disp(['本机IP为',lip]);
复制代码
sendfile.m
  1. function sendfile
  2. %局域网内发送文件,服务端程序。
  3. %
  4. % $作者:baby_wolf$
  5. % $时间:2012-7-20$
  6. %%
  7. [f p]=uigetfile('*.*');
  8. if f~=0   %已选择了文件
  9.     %% 判断文件是否大于5M
  10.     oldpath=cd;   %当前路径
  11. eval(['cd ',p]);  %切换路径
  12. FileList=dir;     
  13. eval(['cd ' oldpath]);
  14. n=size(FileList,1);
  15.          for i=1:n
  16.              if strcmp(FileList(i).name,f)
  17.                  if FileList(i).bytes>6000000
  18.                      error('所选文件超过5M!')
  19.                  end
  20.              end
  21.          end
  22.             fid=fopen([p f]);
  23.             data=fread(fid);
  24.             fclose(fid);
  25.             %% 获取本机IP
  26.                %{
  27.                 [s r]=system('ipconfig');
  28.                 r=regexp(r,'IP Address. . . . . . . . . . . . : \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','match');
  29.                 r=r{1};
  30.                 r=regexp(r,'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','match');
  31.                 lip=r{1};
  32.                 disp(['本机IP为:',lip]);
  33.                 disp('等待接收方连接中...');
  34.                 %}
  35.              %% 建立TCP连接
  36.             tcp=tcpip('0.0.0.0',1314,'networkrole','server');               %建立tcp对象
  37.             set(tcp,'OutputBufferSize',6000000);                            %设置输入缓冲区大小约5M
  38.             fopen(tcp);                                                     %打开连接
  39.             fwrite(tcp,abs(f),'uint16');                                    %写文件名
  40.             while tcp.BytesAvailable~=2                                     %客户端若接收文件名成功,发送两字节确认信息
  41.                 pause(0.1);
  42.             end
  43.             disp('文件名传输成功!');
  44.             fwrite(tcp,length(data),'uint32');     %写长度
  45.             while tcp.BytesAvailable~=4                                     %客户端若接收文件大小成功,再次发送两字节确认信息
  46.                 pause(0.1);
  47.             end
  48.             disp('文件大小传送成功!');
  49.             fwrite(tcp,data,'uint8'); %写文件
  50.             while tcp.BytesAvailable~=6                                     %客户端若接收文件成功,再次发送两字节确认信息
  51.                 pause(0.1);
  52.             end
  53.             disp('文件传输成功!');
  54.             fclose(tcp);
  55. end
复制代码
getfile.m
  1. function getfile(ip)
  2. tcp=tcpip(ip,1314);
  3. set(tcp,'InputBufferSize',6000000);
  4. fopen(tcp);
  5. while tcp.BytesAvailable==0
  6.     pause(0.1);
  7. end
  8. filename=fread(tcp,tcp.BytesAvailable/2,'uint16'); %接收文件名
  9. filename=char(filename);
  10. filename=filename';
  11. fwrite(tcp,1314,'uint16');  %接收名字成功
  12. while tcp.BytesAvailable==0
  13.     pause(0.1);
  14. end
  15. disp(['正在接收文件',filename]);
  16. filesize=fread(tcp,1,'uint32')
  17. disp(['文件共',num2str(filesize),'字节']);
  18. fwrite(tcp,1314,'uint16');  %接收文件大小成功
  19. while tcp.BytesAvailable~=filesize
  20.     pause(0.5);
  21. end
  22. data=fread(tcp,filesize,'uint8');
  23. fwrite(tcp,1314,'uint16');  %接收文件大小成功
  24. [path name ext]=fileparts(filename);
  25. filename=[name, '_' , num2str(round(rand*10000)), ext];
  26. fid=fopen(filename,'w');
  27. fwrite(fid,data,'uint8');
  28. fclose(fid);
  29. fclose(tcp);
复制代码

评分

参与人数 2贝壳 +4 收起 理由
大黑松小倆口 + 2 感谢您分享自己珍贵的资料
machreehappy + 2

查看全部评分

发表于 2012-7-25 11:06:52 | 显示全部楼层
谢谢大神分享,第一个ip代码出现以下问题是什么原因,是因为我只是在一台电脑上,没有局域网的原因吗
??? Index exceeds matrix dimensions.

Error in ==> ip at 5
r=r{1};
回复 支持 1 反对 0

使用道具 举报

发表于 2018-2-24 14:30:50 | 显示全部楼层
stream2011 发表于 2012-7-25 11:06
谢谢大神分享,第一个ip代码出现以下问题是什么原因,是因为我只是在一台电脑上,没有局域网的原因吗
???  ...

这个是英文系统的命令,将出错的行改为:
r=regexp(r,'IPv4 地址 . . . . . . . . . . . . : \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}','match');
回复 支持 反对

使用道具 举报

发表于 2017-3-30 14:59:22 | 显示全部楼层
stream2011 发表于 2012-7-25 11:06
谢谢大神分享,第一个ip代码出现以下问题是什么原因,是因为我只是在一台电脑上,没有局域网的原因吗
???  ...

你好,请问你解决了这个问题了吗,我也想知道这个问题
回复 支持 反对

使用道具 举报

发表于 2012-7-24 21:08:24 | 显示全部楼层
好怀念 好久没有弄了 现在又开始了

来自 云是风的梦 的新浪微博
发表于 2012-7-24 22:02:21 | 显示全部楼层
发表于 2012-7-24 23:26:24 | 显示全部楼层
看了很多你自己的有趣的小程序,更佩服新奇想法的实现
发表于 2012-7-25 10:41:53 | 显示全部楼层
发表于 2012-7-25 11:20:01 | 显示全部楼层
太nb了~
发表于 2012-7-25 13:15:02 | 显示全部楼层
发表于 2012-7-25 13:15:02 | 显示全部楼层
发表于 2012-7-25 14:20:36 | 显示全部楼层
这个太威武了
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2019-8-22 08:49 , Processed in 0.099308 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表