我有一个服务器-客户端套接字聊天应用程序, 在服务器文件夹中,我有一个游戏文件夹,其中有一个我编写的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;
}
}
}
我认为我可能会使过程复杂化,并且有一种更简单的方法... 感谢所有的回应。