C# Winform局域网传送文件

时间:2024-04-17 10:18:59
        //发送文件
        private void btn_sendFile_Click(object sender, EventArgs e)
        {
            //打开文件
            OpenFileDialog dlg = new OpenFileDialog();

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

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

                ClassSocket socketConnet = new ClassSocket(socketSent, ipSent);
                Thread tConnection = new Thread(new ThreadStart(socketConnet.SocketConnect));
                tConnection.Start();

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

                ClassSentFile sentFile = new ClassSentFile(dlg, socketSent);
                Thread tSentFile = new Thread(new ThreadStart(sentFile.SentFile));
                tSentFile.Start();

                
            }
        }

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace Message
{
    class ClassSentFile
    {
        private OpenFileDialog dlg;
        private Socket socketSent;
        public ClassSentFile(OpenFileDialog dlg, Socket socketSent)
        {
            this.dlg = dlg;
            this.socketSent = socketSent;
        }
        public void SentFile()
        {
            string msg = "DAT " + 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();
        }
    }
}