`
qq173684423
  • 浏览: 28306 次
社区版块
存档分类
最新评论

C# soket传输文件

阅读更多
服务器端数据SQLServer查出转存SQLite
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Data.SQLite;
using System.Configuration;
using System.IO;
using System.IO.Compression;
using System.Threading;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.BZip2;
namespace Sockets
{
    public partial class ServerForm : Form
    {
        Socket s = null;
        IPEndPoint iep = null;
        byte[] buf = new byte[5000];
        Socket worker = null;

        private SQLiteCommand comma;
        private SQLiteConnection sqc;

        public ServerForm()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        #region 打开sqlite数据库
        /// <summary>
        /// 打开数据库
        /// </summary>
        private void opensqlite() //打开sqlite数据库
        {
            sqc = new System.Data.SQLite.SQLiteConnection("Data Source=C:\\Documents and Settings\\fei5280\\桌面\\Sockets\\XMLs\\barcodetp.db;Pooling=false;FailIfMissing=false");
            sqc.Open();
            comma = sqc.CreateCommand();
        }
        #endregion

        #region 查询插入数据
        /// <summary>
        /// 数据操作
        /// </summary>
        private void getdata()
        {
            int iCount = 0;
            StringBuilder str = new StringBuilder();
            comma.CommandText = "delete from barlabel";
            comma.ExecuteNonQuery();
            string sqlstr = "SELECT TOP 10000 a.barcode,b.lot_no,a.packing_no,a.grade,a.nwt FROM barcodes.dbo.barin a INNER JOIN hc.dbo.specinfo b ON a.prod_id=b.prod_id";
            DataTable dt = new Sysmis.Data.eTable("bars").Execute(sqlstr);
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                str.Append("INSERT INTO barlabel values('" + dt.Rows[i]["barcode"].ToString() + "','" + dt.Rows[i]["lot_no"].ToString() + "','" + dt.Rows[i]["packing_no"].ToString() + "','" + dt.Rows[i]["grade"].ToString() + "','" + dt.Rows[i]["nwt"].ToString() + "');");
                //str.Append("INSERT INTO barstore values('" + dt.Rows[i]["barcode"].ToString() + "');");
                iCount = iCount + 1;
                if (iCount > 500)
                {
                    comma.CommandText = "BEGIN TRANSACTION;" + str.ToString() + "COMMIT;";
                    //};
                    comma.ExecuteNonQuery();
                    str.Remove(0, str.Length);
                    iCount = 0;
                }
            }
            comma.CommandText = "BEGIN TRANSACTION;" + str.ToString() + "COMMIT;";
            int j = comma.ExecuteNonQuery();
            comma.Dispose();
            sqc.Dispose();
            sqc.Close();

        }
        #endregion

        #region 打开SOCKET TCP通道
        private void button1_Click(object sender, EventArgs e)
        {
            //创建一个通道
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建一个侦听点
            iep = new IPEndPoint(IPAddress.Any, 20000);
            //绑定到通道上
            s.Bind(iep);
            //侦听
            s.Listen(6);
            //通过异步来处理
            s.BeginAccept(new AsyncCallback(Accept), s);
            this.button1.Visible = false;
        }
        #endregion

        #region 处理接收到的消息
        void Accept(IAsyncResult ia)
        {
            s = ia.AsyncState as Socket;
            worker = s.EndAccept(ia);
            s.BeginAccept(new AsyncCallback(Accept), s);
            try
            {
                //检查是否有客户端发送来的操作消息 异步调用
                worker.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), worker);
            }
            catch
            { throw; }
        }
        #endregion

        #region  接收发送消息
        /// <summary>
        /// 当客户端接收到特定的信息的时候自动发送文件barcodetp.db
        /// </summary>
        /// <param name="ia"></param>
        void Receive(IAsyncResult ia)
        {
            try
            {
                opensqlite();
                getdata();
                worker = ia.AsyncState as Socket;  //原本的Socket对象使用用来接收信息,每收到一次,都会创建一个包含该条信息的Socket对象,你只能通过这个创建出来的Socket对象来收取信息,而那个最初的Socket对象只负责接收。
                int count = worker.EndReceive(ia); //结束时挂起异步读取
                worker.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), worker);
                //buf =  ReceiveVarData(worker);

                string context = Encoding.GetEncoding("gb2312").GetString(buf, 0, count);
                this.textBox1.Text += Environment.NewLine;
                this.textBox1.Text += context;
                if (this.textBox1.Text != "")
                {
                    FileStream sr = null;
                    byte[] buffer = null;
                    string path = "C:\\Documents and Settings\\fei5280\\桌面\\Sockets\\XMLs\\barcodetp.db";
                    if (File.Exists(path))
                    {
                        FileInfo EzoneFile = new FileInfo(path);
                        sr = EzoneFile.OpenRead(); //获得读取的FileStream
                        buffer = new byte[sr.Length];  //sr.Length 获得文件的大小 1kb文件 = new byte[1024]; 
                    }
                    else
                    {
                        MessageBox.Show("无法找到文件");
                        return;
                    }
                    //发送[包的大小]到客户端
                    SendVarData(worker, Encoding.GetEncoding("gb2312").GetBytes(sr.Length.ToString()));
                    byte[] data = null;
                    //包的数量
                    int aaa = (int)buffer.Length / 5000;
                    //开始循环发送数据包
                    for (int i = 0; i < aaa; i++)
                    {
                        //从文件流读取数据并填充数据包
                        sr.Read(buf, 0, buf.Length);
                        //发送数据包
                        SendVarData(worker, buf);
                        //显示发送数据包的个数
                    }
                    //未被发送完成的包的数量
                    int bbb = buffer.Length - aaa * 5000;
                    //如果还有多余的数据包,则应该发送完毕!
                    if (bbb != 0)
                    {
                        data = new byte[bbb];
                        sr.Read(data, 0, data.Length);
                        SendVarData(worker, data);
                        // this.progressBar1.Value = this.progressBar1.Maximum;
                    }
                    sr.Flush();
                    sr.Close();
                    // worker.Send(buffer);
                }
            }
            catch
            {

            }
        }
        #endregion

        #region 服务端发送数据的方法(最好不要调用) 客户端可能报错
        private void button2_Click(object sender, EventArgs e)
        {
            string context = "XXXXX" + this.textBox2.Text.Trim();
            if (context != "")
            {
                this.textBox1.Text += Environment.NewLine;
                this.textBox1.Text += context;
                this.textBox2.Text = "";
                worker.Send(Encoding.GetEncoding("gb2312").GetBytes(context));
            }
        }
        #endregion

        #region 循环发送数据
        /// <summary>
        /// 循环传输数据
        /// </summary>
        /// <param name="s"></param>
        /// <param name="data"></param>
        /// <returns>传输数据的数量</returns>
        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;
        }
        #endregion

        #region 循环接收数据
        public byte[] ReceiveVarData(Socket s)
        {
            int recv = 1;
            int total = 0;

            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);
                total += recv;
                dataleft -= recv;
            }
            return data;
        }
        #endregion

        #region   压缩
        public static byte[] Compress(byte[] byteArray)
        {
            //byte[] byteArray = Encoding.UTF8.GetBytes(value); ------当传入为string时
            byte[] tmpArray;

            using (MemoryStream ms = new MemoryStream())
            {
                using (GZipStream sw = new GZipStream(ms, CompressionMode.Compress))
                {
                    sw.Write(byteArray, 0, byteArray.Length);
                    sw.Flush();
                }
                tmpArray = ms.ToArray();
            }
            return tmpArray;
        }
        #endregion

        #region   解压缩
        /// <summary>
        /// 解压缩
        /// </summary>
        /// <param name="value1"></param>
        /// <returns></returns>
        public static byte[] Decompress(byte[] value1)
        {
            //byte[] zippedData = Convert.FromBase64String(value1);  -----当传入为string时
            MemoryStream ms = new MemoryStream(value1);

            GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress);
            MemoryStream outBuffer = new MemoryStream();
            byte[] block = new byte[1024];
            while (true)
            {
                int bytesRead = compressedzipStream.Read(block, 0, block.Length);
                if (bytesRead <= 0)
                    break;
                else
                    outBuffer.Write(block, 0, bytesRead);
            }
            compressedzipStream.Close();
            return outBuffer.ToArray();
        }
        #endregion

        #region 窗口关闭
        public void ServerForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Dispose();
        }
        #endregion

        public static byte[] Zip(byte[] data)
        {
            MemoryStream inStream = new MemoryStream(data);
            MemoryStream outStream = new MemoryStream();
            BZip2.Compress(inStream, outStream, data.Length);
            byte[] result = outStream.ToArray();
            inStream.Close();
            outStream.Close();

            return result;
        }

        public static byte[] Unzip(byte[] data, int offset, int size)
        {
            MemoryStream inStream = new MemoryStream(data, offset, size);
            MemoryStream outStream = new MemoryStream();
            BZip2.Decompress(inStream, outStream);
            byte[] result = outStream.ToArray();
            inStream.Close();
            outStream.Close();
            return result;
        }
    }
}

客户端(winCE通用)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using ICSharpCode.SharpZipLib.BZip2;
using System.Threading;

namespace Sockets
{
    public partial class ClientForm : Form
    {

        Socket s = null;
        IPEndPoint iep = null;
        private int bagCount;
        private string path = "E:\\barcodelot1.db";
        public ClientForm()
        {
            InitializeComponent();
            // Control.CheckForIllegalCrossThreadCalls = false;
        }

        #region 连接服务器端
        private void button1_Click(object sender, EventArgs e)
        {
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            iep = new IPEndPoint(IPAddress.Parse("192.168.10.24"), 20000);
            try
            {
                s.Connect(iep);
                this.label1.Text = "连接成功";
                this.button1.Visible = false;
            }
            catch
            { throw; }
        }
        #endregion

        #region 发送消息 接收服务端传输过来的文件
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {

            this.label3.Visible = true;
            this.label3.Text = "数据准备中.......";
            Application.DoEvents();
            this.button2.Enabled = false;
            string context = iep.ToString() + ":" + this.textBox2.Text.Trim();
            //this.textBox1.Text += Environment.NewLine;
            this.textBox1.Text += context;
            this.textBox2.Text = "";
           
            //if (File.Exists(path))
            //{
            //    File.Delete(path);
            //}
            //发送数据的到服务器端
            s.Send(Encoding.GetEncoding("gb2312").GetBytes("s42160144295"));
            //新建服务器端传输的文件
            FileStream MyFileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
            // int SendedCount = 0;
            //接收到服务器端传输的文件大小
            byte[] bu = ReceiveVarData(s);
            bagCount = int.Parse(Encoding.GetEncoding("gb2312").GetString(bu, 0, bu.Length));
            this.progressBar1.Maximum = bagCount;

            while (true)
            {
                this.progressBar1.Visible = true;
                this.label2.Visible = true;
                this.label3.Visible = false;
                Application.DoEvents();
                this.label2.Text = (Convert.ToDouble(MyFileStream.Length) / Convert.ToDouble(bagCount)).ToString("P"); ;
                this.progressBar1.Value = Convert.ToInt32(MyFileStream.Length);
                if (MyFileStream.Length >= bagCount)
                {
                    this.label2.Text = "100 %";
                    this.progressBar1.Value = this.progressBar1.Maximum;
                    break;
                }
                byte[] data = ReceiveVarData(s);
                //  SendedCount++;
                //将接收到的数据包写入到文件流对象
                MyFileStream.Write(data, 0, data.Length);
                //显示已发送包的个数
                //MessageBox.Show("已发送包个数"+SendedCount.ToString());
            }
            //关闭文件流
            MyFileStream.Flush();
            MyFileStream.Close();
            MessageBox.Show("OK");
            this.progressBar1.Value = 0;
            this.label2.Text = "0 %";
            this.button2.Enabled = true;
            this.progressBar1.Visible =false;
            this.label2.Visible = false;

        }
        #endregion



        #region 循环接收数据
        public byte[] ReceiveVarData(Socket s)
        {
            int recv = 1;
            int total = 0;

            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);
                total += recv;
                dataleft -= recv;
            }
            return data;
        }
        #endregion

        //#region 解压缩 暂未用到
        //public byte[] Decompress(byte[] value1)
        //{
        //    //byte[] zippedData = Convert.FromBase64String(value1);
        //    MemoryStream ms = new MemoryStream(value1);
        //    GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress);
        //    MemoryStream outBuffer = new MemoryStream();
        //    byte[] block = new byte[1024];
        //    while (true)
        //    {
        //        int bytesRead = compressedzipStream.Read(block, 0, block.Length);
        //        if (bytesRead <= 0)
        //        {
        //            break;
        //        }
        //        else
        //            outBuffer.Write(block, 0, bytesRead);
        //    }
        //    compressedzipStream.Close();
        //    return outBuffer.ToArray();
        //}
        //#endregion

        //#region 关闭窗口
        //public void ClientForm_FormClosing(object sender, FormClosingEventArgs e)
        //{
        //    this.Dispose();
        //}
        //#endregion


        public static byte[] Unzip(byte[] data)
        {
            MemoryStream inStream = new MemoryStream(data);
            MemoryStream outStream = new MemoryStream();
            BZip2.Decompress(inStream, outStream);

            byte[] result = outStream.ToArray();
            inStream.Close();
            outStream.Close();
            return result;
        }

    }
}
分享到:
评论

相关推荐

    c# socket 传输文件

    - 如果需要在不安全的网络环境中传输文件,可以考虑使用SSL/TLS加密Socket,提供数据传输的安全性。 10. **示例代码** ```csharp // Server端简化示例 Socket serverSocket = new Socket(AddressFamily....

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

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

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

    - **安全性**:如果是在不安全的网络环境中传输文件,应考虑使用SSL/TLS等加密机制保证数据的安全性。 - **文件分块**:对于大文件,可能需要分块传输,每次发送一小部分,以避免内存溢出。 在压缩包中的`Socket...

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

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

    C#SOCKET大文件传输.zip

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

    C#网络传输文件(socket)

    标题"**C#网络传输文件(socket)**"涉及的核心概念有: 1. **C# Socket编程**:C#提供了Socket类,用于建立TCP/IP连接。TCP(传输控制协议)是一种面向连接的、可靠的网络协议,确保数据包按顺序到达且无丢失。 2. *...

    c# Socket Tcp传输文件

    总结来说,"c# Socket Tcp传输文件"涉及到的关键知识点有: 1. TCP协议的工作原理和特性。 2. C#中的`System.Net.Sockets.Socket`类及其使用方法。 3. 文件流读写和字节流处理。 4. 数据传输的缓冲区管理和批量操作...

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

    本文将深入探讨如何使用C#语言通过Socket实现大文件的分包传输,以解决在数据传输过程中可能遇到的网络拥堵、内存限制等问题。 首先,理解Socket的基本概念。Socket是网络通信中的一个端点,它提供了一种在不同...

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

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

    C# SOCKET传文件,带进度条

    使用SOCKET传输文件,自带进度条,只是一个自己写来学习的脚本,很多是在代码里写死的...自己修改下吧...

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

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

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

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

    C# SOCKET加密文件消息传输通信

    文件传输是网络通信中的常见需求,结合SOCKET和加密技术,我们能够安全地传输文件。在C#中,文件读写操作通常通过FileStream类完成,而将文件内容分块并通过SOCKET发送则需要利用Socket类的Send和Receive方法。同时...

    C# Socket Tcp文件传输下载

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

    C# Socket传输主机硬件配置信息

    C# Socket传输主机硬件配置信息 一、Server ---服务端,引用了xxbtool和datatool,主要功能:接收客户端XML文件与主机配置Model写入数据库。 二、Client ---客户端,引用xxbtool,暂时功能只有:与服务端消息通信、...

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

    在C#中,你可以设计自己的文件传输协议,例如,先发送文件名和文件大小,然后分块传输文件内容。 6. **错误处理和异常**:在文件传输过程中,可能会遇到网络中断、文件过大等问题。因此,需要适当的错误处理机制,...

    c# socket 高性能传送大文件

    C#作为.NET框架的主要编程语言,提供了强大的Socket类库来处理网络通信,包括高效地传输大文件。本文将深入探讨如何利用C# Socket实现高性能的大文件传输。 标题"**C# Socket 高性能传送大文件**"涉及的关键技术点...

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

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

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

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

Global site tag (gtag.js) - Google Analytics