• C# Socket 发送文件 多线程


    控制台界面,分服务器端与客户端,经测试,多个客户端能成功同时发送大文件给服务器端

    服务器端:

        class Program
    {
    const int BufferSize = 1024;
    static string path = @"E:\";
    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);
    Console.WriteLine("Begin listen...");

    while (true)
    {
    Socket client = sock.Accept();
    if (client.Connected)
    {
    Thread cThread = new Thread(new ParameterizedThreadStart(myClient));
    cThread.IsBackground = true;
    cThread.Start(client);
    }
    }
    }

    static void myClient(object oSocket)
    {
    Socket clientSocket = (Socket)oSocket;
    string clientName = clientSocket.RemoteEndPoint.ToString();
    Console.WriteLine("新来一个客户:" + clientName);
    try
    {
    while (true)
    {
    byte[] buffer = new byte[BufferSize];
    int count = clientSocket.Receive(buffer);
    Console.WriteLine("收到" + clientName + ":" + Encoding.Default.GetString(buffer, 0, count));
    string[] command = Encoding.Default.GetString(buffer, 0, count).Split(',');
    string fileName;
    long length;
    if (command[0] == "namelength")
    {
    fileName = command[1];
    length = Convert.ToInt64(command[2]);
    clientSocket.Send(Encoding.Default.GetBytes("OK"));
    long receive = 0L;
    Console.WriteLine("Receiveing file:" + fileName + ".Plz wait...");
    using (FileStream writer = new FileStream(Path.Combine(path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))
    {
    int received;
    while (receive < length)
    {
    received = clientSocket.Receive(buffer);
    writer.Write(buffer, 0, received);
    writer.Flush();
    receive += (long)received;
    }
    }
    Console.WriteLine("Receive finish.\n");
    }
    }
    }
    catch
    {
    Console.WriteLine("客户:" + clientName + "退出");
    }

    }
    }


    客户端:

        class Program
    {
    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("Connect successfully");
    while (true)
    {
    Console.WriteLine("please input the path of the file which you want to send:");
    string path = Console.ReadLine();
    try
    {
    using (FileStream reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
    {
    long send = 0L, length = reader.Length;
    string sendStr = "namelength," + Path.GetFileName(path) + "," + length.ToString();

    string fileName = Path.GetFileName(path);
    sock.Send(Encoding.Default.GetBytes(sendStr));

    int BufferSize = 1024;
    byte[] buffer = new byte[32];
    sock.Receive(buffer);
    string mes = Encoding.Default.GetString(buffer);

    if (mes.Contains("OK"))
    {
    Console.WriteLine("Sending file:" + fileName + ".Plz wait...");
    byte[] fileBuffer = new byte[BufferSize];
    int read, sent;
    while ((read = reader.Read(fileBuffer, 0, BufferSize)) != 0)
    {
    sent = 0;
    while ((sent += sock.Send(fileBuffer, sent, read, SocketFlags.None)) < read)
    {
    send += (long)sent;
    }
    }
    Console.WriteLine("Send finish.\n");
    }
    }
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }
    }
    }
    }
  • 相关阅读:
    Codeforces 1111D(退背包、排列组合)
    Codeforces 1152D(dp)
    UVaLive6443(线段树)
    UVaLive6435(dp)
    POJ1741(点分治)
    Codeforces 161D(树形dp)
    BZOJ2595(状压dp)
    关于spring java.lang.IllegalArgumentException: Name for argument type [java.lang.String] 的错误
    FingerPrint Fuzzy Vault Matlab实践
    Mybatis的ResultMap的使用
  • 原文地址:https://www.cnblogs.com/weeksun23/p/2311978.html
Copyright © 2020-2023  润新知