C#网络编程之TCP(五)
一、文件的上传
如果我们不单单要传输文字,还希望把文件传输至服务器,那么应该怎么做呢?
之前的章节中我们知道,tcp的数据传输在网络信道中是以字节的方式传输的,所以传输文件的时候,也是需要把文件转换成字节。
二、小文件的传输
首先我们在指定目录下建立一个文件;如图所示,我们在临时目录 D:\TempFile 下建立了一个文件,并将其打包成zip格式的压缩文件。
然后我们编写客户端与服务端代码,将文件传输给服务端,并保存下来。
客户端代码:
using System.Net.Sockets; using System.Net; using System.Text; const string ip = "127.0.0.1"; const int port = 10002; // 建立服务器 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint point = new IPEndPoint(IPAddress.Parse(ip), port); socket.Connect(point); Console.WriteLine("链接至服务器..."); // 文件路径 string path = @"D:/TempFile/HelloWorld.zip"; byte[] buffer = File.ReadAllBytes(path); socket.Send(buffer); Console.WriteLine("发送文件");
服务端代码:
using System.Net.Sockets; using System.Net; using System.Text; using System.Collections; const string ip = "127.0.0.1"; const int port = 10002; // 建立服务器 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint point = new IPEndPoint(IPAddress.Parse(ip), port); socket.Bind(point); socket.Listen(); // 监听客户端发起连接 Socket conn = socket.Accept(); Console.WriteLine("有客户端连接..."); Thread.Sleep(1000); byte[] bytes = new byte[1024]; int len = conn.Receive(bytes); // 临时文件名 string fileSavePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "upload.zip"; using (FileStream fs = new FileStream(fileSavePath, FileMode.OpenOrCreate, FileAccess.Write)) { fs.Write(bytes, 0, len); } Console.WriteLine($"接受文件并保存在{fileSavePath}目录下"); // 关闭连接 conn.Close();
运行后,我们来查看结果。
从结果中可以得知,文件被正确地传输了过来,并保存在了服务端的目录下。