开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2521|回复: 1
收起左侧

[C#图文教程] 转 C#实现局域网文件传输

[复制链接]

结帖率:100% (6/6)
发表于 2013-2-17 23:53:48 | 显示全部楼层 |阅读模式   广东省东莞市
网络通信一般都是通过Socket进行的,称为进程通信机制,通常也称作"套接字",用于描述ip地址和端口,是一个通信链的句柄。

先学习一下socket基本原理:

socket原理:
  在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

Socket的形像理解:

socket非常类似于电话插座。以一个国家级电话网为例。

电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。

任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。

然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。

对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。

双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。

通话结束后,一方挂起电话机相当于关闭socket,撤消连接。



Socket 通信应用示图







TCP/IP 客户端/服务端通信流程图





通过Socket通信原理的认识,下面可以开始写一个简单的通信程序,进行验证。

在这里,做了一个局域网内文件传输程序,其实模仿飞鸽传输的功能。

在公司里面是禁用QQ,不能使用QQ,有时发现挺麻烦的,传输文件不方便,搞得经常要用U盘来拷东西。

为此,我设想写一个简单的局域网文件传输入工具,暂时解决不能上QQ的痛苦。

发送文件代码片段:

      
  /// <summary>
        /// 发送文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        PRivate void btnSentFile_Click(object sender, EventArgs e)
        {
            //打开文件
            OpenFileDialog dlg = new OpenFileDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < lvwDisplayUser.SelectedItems.Count; i++)
                {
                    string ip = this.lvwDisplayUser.SelectedItems[i].SubItems[2].Text;

                    //初始化接受套接字:寻址方案,以字符流方式和Tcp通信
                    socketSent = new Socket(AddressFamily.InterNetwork,
                           SocketType.Stream,
                           ProtocolType.Tcp);

                    //设置服务器IP地址和端口
                    ipSent = new IPEndPoint(IPAddress.Parse(ip), 8001);

                    //与服务器进行连接
                    LanSocket socketConnet = new LanSocket(socketSent, ipSent);
                    Thread tConnection = new Thread(new ThreadStart(socketConnet.SocketConnect));
                    tConnection.Start();

                    Thread.Sleep(100);
                    //将要发送的文件加上"DAT"标识符

                    SentLanFile sentFile = new SentLanFile(dlg, socketSent);
                    Thread tSentFile = new Thread(new ThreadStart(sentFile.SentFile));
                    tSentFile.Start();
                }
            }
        }
   
        /// <summary>
        /// 发送文件
        /// </summary>
        public void SentFile()
        {
            string msg = "0DAT " + dlg.FileName;

            //将 "msg" 转化为字节流的形式进行传送
            socketSent.Send(Encoding.Default.GetBytes(msg));

            //定义一个读文件流
            FileStream read = new FileStream(dlg.FileName, FileMode.Open, Fileaccess.Read);

            //设置缓冲区为1024byte
            byte[] buff = new byte[1024];
            int len = 0;
            while ((len = read.Read(buff, 0, 1024)) != 0)
            {
                //按实际的字节总量发送信息
                socketSent.Send(buff, 0, len, SocketFlags.None);
            }

            //将要发送信息的最后加上"END"标识符
            msg = "END";

            //将 "msg" 发送
            socketSent.Send(Encoding.Default.GetBytes(msg));
            socketSent.Close();
            read.Close();
结帖率:69% (9/13)

签到天数: 6 天

发表于 2023-8-25 16:17:42 | 显示全部楼层   江西省抚州市
6666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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