`

c# Socket 文件的传输

阅读更多

服务器端:

namespace Server
{
    public delegate void ReceiveCompletedEventHandler(string bagSize, string Address, string SendedCount, string SendFileName, string bagCount, string bagLast);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.dataGridView1.AllowUserToAddRows = false;
            this.ReceiveCompleted += new ReceiveCompletedEventHandler(Form1_ReceiveCompleted);
        }

        void Form1_ReceiveCompleted(string bagSize, string Address, string SendedCount, string SendFileName, string bagCount, string bagLast)
        {
            if (this.dataGridView1.InvokeRequired)
            {
                this.dataGridView1.Invoke(new ReceiveCompletedEventHandler(Form1_ReceiveCompleted), bagSize, Address, SendedCount, SendFileName, bagCount, bagLast);
            }
            else
            {
                this.dataGridView1.Rows.Add(bagSize, Address, SendedCount, SendFileName, bagCount, bagLast);
            }
        }
        Thread thread;
        private void Form1_Load(object sender, EventArgs e)
        {
            //开启接受线程
            thread = new Thread(new ThreadStart(StartReceive));
            thread.Start();
        }

        private event ReceiveCompletedEventHandler ReceiveCompleted;


        private void Completed(string bagSize, string Address, string SendedCount, string SendFileName, string bagCount, string bagLast)
        {
            if (ReceiveCompleted != null)
            {
                ReceiveCompleted(bagSize, Address, SendedCount, SendFileName, bagCount, bagLast);
            }
        }
        Socket client;
        Socket server;

        #region 功能函数
        /// <summary>
        /// 服务器端接收线程方法
        /// </summary>
        private void StartReceive()
        {
            //创建一个网络端点
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("2010"));

            //MessageBox.Show(IPAddress.Any);

            //创建一个套接字
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //绑定套接字到端口
            server.Bind(ipep);

            //开始侦听(并堵塞该线程)
            server.Listen(10);
            while (true)
            {
                //确认连接
                client = server.Accept();
                //获得客户端节点对象
                Thread ThreadClient = new Thread(new ThreadStart(ClientMethod));
                ThreadClient.Start();
            }
        }

        private void ClientMethod()
        {
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

            //获得[文件名]
            string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
            //MessageBox.Show("文件名" + SendFileName);

            //获得[包的大小]
            string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
            //MessageBox.Show("包大小" + bagSize);

            //获得[包的总数量]
            int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
            //MessageBox.Show("包的总数量" + bagCount);

            //获得[最后一个包的大小]
            string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
            //MessageBox.Show("最后一个包的大小" + bagLast);

            string filepath = null;
            string fileName = SendFileName;
            string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
            if (fileNameExt == "svd")
            {
                filepath = @"D:\FileSave\SVD\";
                if (!Directory.Exists(filepath))
                    Directory.CreateDirectory(filepath).ToString();
            }
            else if (fileNameExt == "jpg")
            {
                filepath = @"D:\FileSave\JPG\";
                if (!Directory.Exists(filepath))
                    Directory.CreateDirectory(filepath).ToString();
            }
            else
            {
                filepath = @"D:\FileSave\File\";
                if (!Directory.Exists(filepath))
                    Directory.CreateDirectory(filepath).ToString();
            }

            //创建一个新文件
            FileStream MyFileStream = new FileStream(filepath + SendFileName, FileMode.Create, FileAccess.Write);

            //已发送包的个数
            int SendedCount = 0;

            while (true)
            {
                byte[] data = TransferFiles.ReceiveVarData(client);
                if (data.Length == 0)
                {
                    break;
                }
                else
                {
                    SendedCount++;
                    //将接收到的数据包写入到文件流对象
                    MyFileStream.Write(data, 0, data.Length);
                    //显示已发送包的个数
                    //MessageBox.Show("已发送包个数"+SendedCount.ToString());
                }
            }

            //关闭文件流
            MyFileStream.Close();
            //关闭套接字
            client.Close();
            Completed(bagSize, clientep.Address.ToString(), SendedCount.ToString(), SendFileName, bagCount.ToString(), bagLast);
        }
        #endregion

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                server.Close();
                Application.Exit();
            }
            catch (Exception)
            {
                
                throw;
            }
        }
    }
}

 

客户端:

 public Form1()
        {
            InitializeComponent();
            this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
        }

        //发送
        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox7.Text.Trim() == "")
            {
                MessageBox.Show("接收端IP不能为空!");
                return;
            }
            progressBar1.Value = 0;
            button2.Enabled = false;
            Thread TempThread = new Thread(new ThreadStart(this.StartSend));
            TempThread.Start();
            
        }


        /// <summary>
        /// 客户端文件传输子线程方法(上传方法)
        /// </summary>
        private void StartSend()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new ThreadStart(StartSend));
            }
            else
            {
                //创建一个文件对象
                FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
                //打开文件流
                FileStream EzoneStream = EzoneFile.OpenRead();
                //包的大小
                int PacketSize = int.Parse(this.textBox6.Text);
                //包的数量
                int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
                this.textBox8.Text = PacketCount.ToString();

                this.progressBar1.Maximum = PacketCount;
                //最后一个包的大小
                int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
                this.textBox9.Text = LastDataPacket.ToString();

                ////创建一个网络端点
                //IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.136"), int.Parse(this.textBox5.Text));

                ////MessageBox.Show(IPAddress.Any);

                ////创建一个套接字
                //Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                //MessageBox.Show(server.ToString());
                //指向远程服务端节点
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(textBox7.Text.Trim()), int.Parse(this.textBox5.Text));
                //创建套接字
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //连接到发送端
                client.Connect(ipep);
                ////绑定套接字到端口
                //client.Bind(ipep);

                //MessageBox.Show(ipep.ToString());

                ////开始侦听(并堵塞该线程)
                //server.Listen(10);
                //确认连接
                //Socket client = server.Accept();

                //MessageBox.Show(client.ToString());

                //获得客户端节点对象
                IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
                //获得客户端的IP地址
                //this.textBox7.Text=clientep.Address.ToString();
                //发送[文件名]到客户端
                CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
                //发送[包的大小]到客户端
                CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
                //发送[包的总数量]到客户端
                CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
                //发送[最后一个包的大小]到客户端
                CommonModule.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));

                //数据包
                byte[] data = new byte[PacketSize];
                //开始循环发送数据包
                for (int i = 0; i < PacketCount; i++)
                {
                    //从文件流读取数据并填充数据包
                    EzoneStream.Read(data, 0, data.Length);
                    //发送数据包
                    CommonModule.SendVarData(client, data);
                    //显示发送数据包的个数
                    this.textBox10.Text = ((int)(i + 1)).ToString();
                    //进度条值的显示
                    this.progressBar1.PerformStep();
                }

                //如果还有多余的数据包,则应该发送完毕!
                if (LastDataPacket != 0)
                {
                    data = new byte[LastDataPacket];
                    EzoneStream.Read(data, 0, data.Length);
                    CommonModule.SendVarData(client, data);
                    this.progressBar1.Value = this.progressBar1.Maximum;
                }

                //关闭套接字
                client.Close();
                //server.Close();
                //关闭文件流
                EzoneStream.Close();
                this.button2.Enabled = true;
                MessageBox.Show("文件传输完毕!");
            }
        }

        //浏览文件
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                FileInfo info = new FileInfo(openFileDialog1.FileName);
                textBox1.Text = info.FullName;
                textBox2.Text = info.Name;
                textBox3.Text = info.Length.ToString();
            }
        }

 

公共类代码:

 class CommonModule
    {
        public static int SendData(Socket s, byte[] data)
        {
            int total = 0;
            int size = data.Length;
            int dataleft = size;
            int sent;

            while (total < size)
            {
                sent = s.Send(data, total, dataleft, SocketFlags.None);
                total += sent;
                dataleft -= sent;
            }

            return total;
        }

        public static byte[] ReceiveData(Socket s, int size)
        {
            int total = 0;
            int dataleft = size;
            byte[] data = new byte[size];
            int recv;
            while (total < size)
            {
                recv = s.Receive(data, total, dataleft, SocketFlags.None);
                if (recv == 0)
                {
                    data = null;
                    break;
                }

                total += recv;
                dataleft -= recv;
            }
            return data;
        }

        public static int SendVarData(Socket s, byte[] data)
        {
            int total = 0;
            int size = data.Length;
            int dataleft = size;
            int sent;
            byte[] datasize = new byte[4];
            datasize = BitConverter.GetBytes(size);
            sent = s.Send(datasize);

            while (total < size)
            {
                sent = s.Send(data, total, dataleft, SocketFlags.None);
                total += sent;
                dataleft -= sent;
            }

            return total;
        }

        public static byte[] ReceiveVarData(Socket s)
        {
            int total = 0;
            int recv;
            byte[] datasize = new byte[4];
            recv = s.Receive(datasize, 0, 4, SocketFlags.None);
            int size = BitConverter.ToInt32(datasize, 0);
            int dataleft = size;
            byte[] data = new byte[size];
            while (total < size)
            {
                recv = s.Receive(data, total, dataleft, SocketFlags.None);
                if (recv == 0)
                {
                    data = null;
                    break;
                }
                total += recv;
                dataleft -= recv;
            }
            return data;
        }
    }

 

分享到:
评论
2 楼 net_liu 2010-09-19  
zxptian 写道
楼主能把TransferFiles也贴出来分享下吗?

把 CommonModule 这个公共类改成TransferFiles就可以了!!
1 楼 zxptian 2010-09-16  
楼主能把TransferFiles也贴出来分享下吗?

相关推荐

    C#Socket文件传输简单例子(将文件名和文件同时传输)

    在压缩包中的`SocketDemo`项目中,应该包含了实现这个功能的C#代码示例,你可以参考其中的`Server`和`Client`类,理解并学习如何使用Socket进行文件传输。通过实际操作,你会更深入地掌握C# Socket通信的核心技巧。

    c# socket 文件传输 源码 即时 中文 字符

    通过以上步骤,你可以实现一个基本的C# Socket文件传输系统,它能够支持即时通信并处理中文字符。在实际项目中,还需要根据具体需求进行进一步的优化和功能扩展,如添加身份验证、加密传输等安全措施。总之,理解并...

    c# socket 传输文件

    在本文中,我们将深入探讨如何使用C# Socket类进行文件传输,包括文件的发送和接收,以及在此过程中可能遇到的关键技术和注意事项。 1. **Socket基本概念** - Socket是基于TCP/IP协议族的通信接口,它允许应用程序...

    C#socket 大文件传输 分段传输 C#DEMO

    C#socket 大文件传输 分段传输 C#DEMO

    C#socket文件传输源码

    C#socket点对点文件传输几个源码及一些关于socket文件传输的文档

    C# socket文件传输源码

    C# 写的基于socket的文件传输项目源码,可执行

    C#SOCKET大文件传输.zip

    本示例"**C#SOCKET大文件传输.zip**"聚焦于利用C#的Socket类进行大文件的高效、稳定传输,特别是支持高并发和断点续传功能,这对于开发大规模、高性能的应用程序至关重要。 首先,我们来理解**Socket**。Socket是...

    c# Socket Tcp传输文件

    本篇文章将详细讲解如何使用C#的Socket通过TCP协议进行文件传输。 首先,我们需要了解TCP的基本特性。TCP保证了数据的顺序传输和错误检查,通过三次握手建立连接,四次挥手断开连接。它提供了一种可靠的数据传输...

    C# socket 文件传输,异地备份

    - **校验和**:在文件传输前后计算校验和,确保文件完整无误。 - **多线程/异步处理**:为了提高效率,可以考虑使用多线程或异步操作同时传输多个文件。 5. **异常处理**:在网络通信中,异常处理至关重要,要...

    C# socket TCP 大文件传输同时实现断点续传

    在C#编程语言中,利用Socket API进行TCP通信可以构建高效、稳定的文件传输系统,特别是在处理大文件时,断点续传功能则显得尤为必要。下面,我们将深入探讨如何使用C#的Socket实现TCP大文件传输并支持断点续传。 ...

    C# Socket实现大文件分包传输

    在大文件传输场景下,一次性将整个文件发送到服务器可能会导致网络拥塞或内存溢出,因此需要将大文件分包传输。分包的过程主要包括以下步骤: 1. **文件读取**:首先,客户端需要读取大文件,并将其内容按一定大小...

    socket文件传输(c#)

    局域网socket文件传输(c#) 局域网socket文件传输(c#)

    【源码】C# Socket基本协议传输大文件 (附Demo)

    其中Model为模型项目,SocketProtocol为传输协议,Utility为帮助类 本案例通过一个基本协议,使用socket传送数据,能够达到大量数据发送不发生粘包等常见现象,在我本机测试,一次性能够传送的数据包大小为系统一次性能够...

    C# Socket Tcp文件传输和文字聊天系统

    标题中的"C# Socket Tcp文件传输和文字聊天系统"是指使用C#编程语言,基于Socket和TCP协议实现的一个功能,它涵盖了文件传输和文字聊天两大功能。Socket是网络通信中的一个基本概念,它允许两个网络应用进行数据交换...

    C#socket局域网文件传输电脑端131114

    本项目"C# socket局域网文件传输电脑端131114"提供了在C#编程环境下,利用socket技术实现在局域网内的多文件传输功能。下面我们将详细探讨涉及的关键知识点。 1. **C# Socket编程**:Socket是网络通信的基础,它...

    C# Socket Tcp文件传输下载

    本篇将详细讲解基于C#的Socket和Tcp进行文件传输下载的相关知识点。 首先,Socket是网络通信的基础,它是应用程序与网络协议交互的接口。在C#中,`System.Net.Sockets.Socket` 类提供了一个用于实现TCP、UDP等网络...

    C#socket局域网文件传输电脑端

    本篇将详细介绍如何利用C# Socket实现局域网内的文件传输。 首先,我们需要理解Socket的基本概念。Socket是网络通信中的一个端点,它允许两个应用程序通过网络进行数据交换。在C#中,System.Net.Sockets命名空间...

    C#基于TCP的Socket多线程通信(包含服务端和客户端)

    C#是一种广泛用于构建桌面和Web应用程序的编程语言,它提供了强大的网络编程能力,其中包括使用TCP Socket进行多线程通信。本篇文章将深入探讨C#中基于TCP的Socket多线程通信,包括服务端和客户端的实现。 TCP...

    C# Socket传输加密文件并解密(WinForm版)

    这是我用C#编写的基于Socket网络编程技术,在网络上传输加密文件,并对其进行数字签名,在另一端进行解密,并验证签名的一个WinForm程序,里面涉及到的加密解密算法有对称密码算法DES和非对称密码算法RSA加密解密...

    c# socket 高性能传送大文件

    本文将深入探讨如何利用C# Socket实现高性能的大文件传输。 标题"**C# Socket 高性能传送大文件**"涉及的关键技术点包括: 1. **C# Socket基础**:Socket是网络通信的基础,它基于TCP/IP协议,提供低级别的网络...

Global site tag (gtag.js) - Google Analytics