我尝试使用SendFile
方法https://msdn.microsoft.com/en-us/library/sx0a40c2(v=vs.110).aspx
TcpClient client;
private void Form1_Load(object sender, EventArgs e)
{
client = new TcpClient();
client.Connect("10.0.0.1", 10);
string fileName = @"C:\Users\itapi\Desktop\da.jpg";
Console.WriteLine("Sending {0} to the host.", fileName);
client.Client.SendFile(fileName);
}
服务器代码:
TcpListener listener;
TcpClient cl;
private void Form1_Load(object sender, EventArgs e)
{
listener = new TcpListener(IPAddress.Any, 10);
listener.Start();
cl = listener.AcceptTcpClient();
}
我的问题是:我应该如何获取另一方的文件?我不想只使用网络流纯粹的套接字。 任何帮助都会得到解决
答案 0 :(得分:3)
基本配方是:
最简单的方法是使用NetworkStream
。
我不想只使用网络流纯粹的套接字
让我们再看一下Stream.CopyTo
的内部:
private void InternalCopyTo(Stream destination, int bufferSize)
{
int num;
byte[] buffer = new byte[bufferSize];
while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
{
destination.Write(buffer, 0, num);
}
}
和NetworkStream.Write
:
public override void Write(byte[] buffer, int offset, int size)
{
// Insert Lots and Lots of checks and safety's here:
streamSocket.Send(buffer, offset, size, SocketFlags.None);
}
另请注意NetworkStream
负责正确的连接处理,正确关闭连接等。
简而言之,您可能不想使用NetworkStream
只有一个很好的理由,那就是:我想完全实现同步,因为CopyTo实现是同步的。如果您使用async
/ await
,即使这一点也存在很大争议。这适用于服务器环境中的高性能(c.q.许多连接)。
如果是这种情况,您可能需要在此处开始使用示例代码:https://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx。
答案 1 :(得分:0)
文件以字节形式发送。没有标题或任何东西。只是文件字节。
您可能应该使用File.Create
打开要保存此文件的文件并使用new NetworkStream(mySocket).CopyTo(myFile)
。
我不想使用networkstream
这使得它变得更难。自己写一个流复制循环。
答案 2 :(得分:0)
除了以下代码之外,还必须关闭while循环的发送套接字才能退出。 blockCtr和totalReadBytes仅为诊断。
private void btnReceive_Click(object sender, EventArgs e)
{
const int arSize = 100;
byte[] buffer = new byte[arSize];
string outPath = @"D:\temp\rxFile.jpg";
Stream strm = new FileStream(outPath, FileMode.CreateNew);
try
{
listener = new TcpListener(IPAddress.Any, 10);
listener.Start();
cl = listener.AcceptTcpClient();
SocketError errorCode;
int readBytes = -1;
int blockCtr = 0;
int totalReadBytes = 0;
while (readBytes != 0)
{
readBytes = cl.Client.Receive(buffer, 0, arSize, SocketFlags.None, out errorCode);
blockCtr++;
totalReadBytes += readBytes;
strm.Write(buffer, 0, readBytes);
}
strm.Close();
MessageBox.Show("Received: " + totalReadBytes.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}