使用套接字C#传输文件

时间:2018-07-08 13:46:32

标签: c# sockets

我有一个服务器-客户端套接字聊天应用程序, 在服务器文件夹中,我有一个游戏文件夹,其中有一个我编写的JavaScript游戏,该游戏的图片以及一个用于运行该游戏的html页面。 当客户端编写命令“ @game”时,服务器将向他发送游戏文件,并且客户端会将游戏文件下载到C目录。 我试图以几种方式传输文件,但它们似乎都失败了,似乎html文件和JS文件已完全传输,但是图片不完整,这就是游戏无法正常工作的原因... < / p>

我只需要使用套接字传输文件即可。

服务器端

我使用了SendFile方法,并且在每个文件数据发送“ \ d”作为标记后,移至下一个数据,以便客户端可以知道文件数据之间的区别。

        public static bool Game(string msg, Socket socket)
    {
        if (msg.Equals("@game"))
        {
            ASCIIEncoding asc = new ASCIIEncoding();
            string path = @"G:\הנדסת תוכנה\כיתה יא\ChatProject\ServerChat\game";
            socket.Send(asc.GetBytes("@game"));
            Byte[] preBuffer = asc.GetBytes("@download ");
            Byte[] postBuffer = asc.GetBytes("@End");

            socket.SendFile(path + @"\SpaceShip.js");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\page.html");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\background.jpg");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\defeat.png");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\enemyspaceship.png");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\friendlyspaceship.png");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\IMG_06062017_225026_0.png");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\laser.png");
            socket.Send(asc.GetBytes(@"\d"));
            socket.SendFile(path + @"\Images\victory.png");
            socket.Send(asc.GetBytes(@"\d"));
            Console.WriteLine("Game was send to "+socket.RemoteEndPoint);
            return true;
        }
        return false;
    }

客户端

首先在客户端创建目录,然后让我自己编写文件发送的顺序,在“下载”功能中,我每隔2个字符移动一次,以检查是否有已发送的“ \ d”符号,如果遇到一个文件,我就知道它是数据文件的末尾,然后将数据写到我创建的文件上。

  public static void Game()
    {
        Console.WriteLine("downloading and opening the game...");
        string path = @"C:\Game";
        DirectoryInfo di = Directory.CreateDirectory(path);
        di = Directory.CreateDirectory(path+@"\Images");
        Console.WriteLine("The directory was created successfully ");
        Console.WriteLine("reciving Data");
        string[] pathArr = new string[]
        {
            path + @"\SpaceShip.js",
            path + @"\page.html",
            path + @"\Images\background.jpg",
            path + @"\Images\defeat.png",
            path + @"\Images\enemyspaceship.png",
            path + @"\Images\friendlyspaceship.png",
            path + @"\Images\IMG_06062017_225026_0.png",
            path + @"\Images\laser.png",
            path + @"\Images\victory.png"
        };
        Download(pathArr);
        Console.WriteLine("Done!");
        System.Diagnostics.Process.Start(path + @"\page.html");
    }
    public static void Download(string [] pathArr)
    {

        byte[] binDataIn = new byte[1025];
        int k = socket.Receive(binDataIn, 0, 1025, SocketFlags.None);
        ASCIIEncoding asc = new ASCIIEncoding();
        string rcv = asc.GetString(binDataIn, 0, k);
        string data = "";
        int j = 0;
        int i = 0;
        while (j<=8)
        {
            string sign = rcv[i].ToString() + rcv[i + 1].ToString();
            if (sign.Equals( @"\d"))
            {
                File.WriteAllText(pathArr[j], data);
                data = "";
                j++;
                i += 2;
            }
            else
            {
                data += rcv[i];
                i++;
            }

            if(rcv.Length-1<=i)
            {
                 k = socket.Receive(binDataIn, 0, 1025, SocketFlags.None);
                 rcv = asc.GetString(binDataIn, 0, k);
                i = 0;
            }
        }
    }

我认为我可能会使过程复杂化,并且有一种更简单的方法... 感谢所有的回应。

0 个答案:

没有答案