C# Socket 文件发送传输

客户端向服务器发送文件:

服务器:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(ip);
            sock.Listen(1);

            while(true)
            {
                Socket client = sock.Accept();

                if (client.Connected)
                {
                    Thread clientThread = new Thread(new ParameterizedThreadStart(MyClient));
                    clientThread.IsBackground = true;
                    clientThread.Start(client);
                }
            }
        }

        private const int BUFFERSIZE = 1024/* * 1024*/;
        private static string _path = @"D:\";

        private static void MyClient(object socket)
        {
            Socket clientSocket = socket as Socket;
            string clientName = clientSocket.RemoteEndPoint.ToString();
            Console.WriteLine("新客户端连接:" + clientName);

            try
            {
                while(true)
                {
                    byte[] buffer = new byte[BUFFERSIZE];
                    int countReceive = clientSocket.Receive(buffer);
                    string receiveStr = Encoding.Default.GetString(buffer, 0, countReceive);
                    Console.WriteLine("收到:" + clientName + ":" + receiveStr);
                    string[] command = receiveStr.Split(',');

                    string fileName = null;
                    long fileLength = -1L;

                    if (command[0] == "nameAndLength")
                    {
                        fileName = command[1];
                        fileLength = long.Parse(command[2]);
                        clientSocket.Send(Encoding.Default.GetBytes("ok"));
                        Console.WriteLine("接收文件:" + fileName + " 请等候……");

                        long recieved = 0L;

                        using (FileStream fsWriter = new FileStream(Path.Combine(_path,fileName), FileMode.Create, FileAccess.Write, FileShare.None))
                        {
                            int recive;

                            while(recieved < fileLength)
                            {
                                recive = clientSocket.Receive(buffer);
                                fsWriter.Write(buffer, 0, recive);
                                fsWriter.Flush();
                                recieved += recive;
                                Console.WriteLine("已接收数据:{0}/{1}", recieved.ToString(), fileLength.ToString());
                            }

                            Console.WriteLine("接收完成……\n");
                        }
                    }
                }
            }
            catch (Exception)
            {
                Console.WriteLine("客户端:" + clientName + "退出");
            }
        }
    }
}

客户端:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Client
{
    class Program
    {
        private static Socket _sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        static void Main(string[] args)
        {
            _sock.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080));
            Console.WriteLine("连接成功…");

            while (true)
            {
                Console.WriteLine("请输入需要发送的文件路径:");
                string path = Console.ReadLine();

                try
                {
                    using (FileStream fsReader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
                    {
                        long sended = 0L;
                        long fileLength = fsReader.Length;
                        string fileName = Path.GetFileName(path);
                        string sendStr = "nameAndLength," + fileName + "," + fileLength.ToString();

                        _sock.Send(Encoding.Default.GetBytes(sendStr));

                        const int BUFFERSIZE = 1024/* * 1024*/;
                        byte[] buffer = new byte[32];

                        int recvCount = _sock.Receive(buffer);
                        string mes = Encoding.Default.GetString(buffer, 0, recvCount);

                        if (mes == "ok")
                        {
                            Console.WriteLine("发送文件:" + fileName + " 请等待……");
                            byte[] fileBuffer = new byte[BUFFERSIZE];

                            int readCount;
                            int sending;
                            int readCountLeft;

                            while ((readCount = fsReader.Read(fileBuffer, 0, BUFFERSIZE)) != 0)
                            {
                                sending = 0;
                                readCountLeft = readCount;
                                while ((sending += _sock.Send(fileBuffer, sending, readCountLeft, SocketFlags.None)) < readCount) // 判断发送完
                                {
                                    readCountLeft = readCount - sending;
                                }
                                sended += sending;
                                Console.WriteLine("发送数据:{0}/{1}", sended.ToString(), fileLength.ToString());
                            }

                            Console.WriteLine("发送完毕……\n");
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
}





命令行

客户端向服务器发文件。

服务器:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Server
{
    class Program
    {
        /*exe 127.0.0.1 8080 D:\\*/
        static void Main(string[] args)
        {
            int port = int.Parse(args[1]);
            _path = args[2];
            Console.WriteLine("开启服务器:{0}", args[0] + " " + args[1]);
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse(args[0]), port);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sock.Bind(ip);
            sock.Listen(100);

            while (true)
            {
                Socket client = sock.Accept();

                if (client.Connected)
                {
                    Thread clientThread = new Thread(new ParameterizedThreadStart(MyClient));
                    clientThread.IsBackground = true;
                    clientThread.Start(client);
                }
            }
        }

        private const int BUFFERSIZE = 1024 * 1024;
        private static string _path = @"D:\";

        private static void MyClient(object socket)
        {
            Socket clientSocket = socket as Socket;
            string clientName = clientSocket.RemoteEndPoint.ToString();
            Console.WriteLine("新客户端连接:" + clientName);

            try
            {
                while (true)
                {
                    byte[] buffer = new byte[BUFFERSIZE];
                    int countReceive = clientSocket.Receive(buffer);
                    string receiveStr = Encoding.Default.GetString(buffer, 0, countReceive);
                    Console.WriteLine("收到:" + clientName + ":" + receiveStr);
                    string[] command = receiveStr.Split(',');

                    string fileName = null;
                    long fileLength = -1L;

                    if (command[0] == "nameAndLength")
                    {
                        fileName = command[1];
                        fileLength = long.Parse(command[2]);
                        clientSocket.Send(Encoding.Default.GetBytes("ok"));
                        Console.WriteLine("接收文件:" + fileName + " 请等候……");

                        long recieved = 0L;

                        using (FileStream fsWriter = new FileStream(Path.Combine(_path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))
                        {
                            int recive;

                            while (recieved < fileLength)
                            {
                                recive = clientSocket.Receive(buffer);
                                fsWriter.Write(buffer, 0, recive);
                                fsWriter.Flush();
                                recieved += recive;
                                Console.WriteLine("已接收数据:{0}/{1}", recieved.ToString(), fileLength.ToString());
                            }

                            Console.WriteLine("接收完成……\n");
                        }
                    }
                }
            }
            catch (Exception)
            {
                Console.WriteLine("客户端:" + clientName + "退出");
            }
        }
    }
}

客户端:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Client
{
    class Program
    {
        private static Socket _sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        /*exe 127.0.0.1 8080 D:\\*/
        static void Main(string[] args)
        {
            int port = int.Parse(args[1]);
            string path = args[2];
            _sock.Connect(new IPEndPoint(IPAddress.Parse(args[0]), port));
            Console.WriteLine("连接成功…");
            bool firstFlag = true;

            while (true)
            {
                if (!firstFlag)
                {
                    Console.WriteLine("请输入需要发送的文件路径:");
                    path = Console.ReadLine();
                }

                try
                {
                    using (FileStream fsReader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
                    {
                        long sended = 0L;
                        long fileLength = fsReader.Length;
                        string fileName = Path.GetFileName(path);
                        string sendStr = "nameAndLength," + fileName + "," + fileLength.ToString();

                        _sock.Send(Encoding.Default.GetBytes(sendStr));

                        const int BUFFERSIZE = 1024 * 1024;
                        byte[] buffer = new byte[32];

                        int recvCount = _sock.Receive(buffer);
                        string mes = Encoding.Default.GetString(buffer, 0, recvCount);

                        if (mes == "ok")
                        {
                            Console.WriteLine("发送文件:" + fileName + " 请等待……");
                            byte[] fileBuffer = new byte[BUFFERSIZE];

                            int readCount;
                            int sending;
                            int readCountLeft;

                            while ((readCount = fsReader.Read(fileBuffer, 0, BUFFERSIZE)) != 0)
                            {
                                sending = 0;
                                readCountLeft = readCount;
                                while ((sending += _sock.Send(fileBuffer, sending, readCountLeft, SocketFlags.None)) < readCount) // 判断发送完
                                {
                                    readCountLeft = readCount - sending;
                                }
                                sended += sending;
                                Console.WriteLine("发送数据:{0}/{1}", sended.ToString(), fileLength.ToString());
                            }

                            Console.WriteLine("发送完毕……\n");
                            firstFlag = false;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
}



posted @   double64  阅读(4096)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示