gpt4 book ai didi

c# - 在 C# 中使用 TCPClient 和 NetworkStream 发送文件

转载 作者:行者123 更新时间:2023-11-30 12:33:04 29 4
gpt4 key购买 nike

我一直在尝试使用 C# 中的 TCPClient 类将文件从客户端发送到服务器应用程序。在发送实际数据之前,我发送了一些附加信息,例如确切的文件大小和文件名,以便服务器应用程序知道有多少数据需要读取。有趣的是,当我在 127.0.0.1 上测试它时,一切都很好——当我用实际 IP 地址替换 IP 地址时,服务器只能读取大约 1.5 KB 的已发送数据。它仍然获取文件名和文件大小,但它无法检索实际数据。

出于测试目的,我用一个简单的字符串替换了我要发送的图像并且传输正常,所以我想发送和接收数据 block 有问题,但我没有收到任何异常客户端。

有人知道吗?干杯!

编辑:

感谢到目前为止,这就是我在代码方面得到的。对于客户:

        IPAddress ipAddress = IPAddress.Parse("xx.xx.xx.xx");
int port = 3003;
int bufferSize = 1024;

TcpClient client = new TcpClient();
NetworkStream netStream;

// Connect to server
try
{
client.Connect(new IPEndPoint(ipAddress, port));

}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

netStream = client.GetStream();

// Read bytes from image
byte[] data = File.ReadAllBytes("C:\\Users\\Dan\\Desktop\\asdf.jpg");

// Build the package
byte[] dataLength = BitConverter.GetBytes(data.Length);
byte[] package = new byte[4 + data.Length];
dataLength.CopyTo(package, 0);
data.CopyTo(package, 4);

// Send to server
int bytesSent = 0;
int bytesLeft = package.Length;

while (bytesLeft > 0)
{

int nextPacketSize = (bytesLeft > bufferSize) ? bufferSize : bytesLeft;

netStream.Write(package, bytesSent, nextPacketSize);
bytesSent += nextPacketSize;
bytesLeft -= nextPacketSize;

}

// Clean up
netStream.Close();
client.Close();

和服务器:

        TcpListener listen = new TcpListener(3003);
TcpClient client;
int bufferSize = 1024;
NetworkStream netStream;
int bytesRead = 0;
int allBytesRead = 0;

// Start listening
listen.Start();

// Accept client
client = listen.AcceptTcpClient();
netStream = client.GetStream();

// Read length of incoming data
byte[] length = new byte[4];
bytesRead = netStream.Read(length, 0, 4);
int dataLength = BitConverter.ToInt32(length,0);

// Read the data
int bytesLeft = dataLength;
byte[] data = new byte[dataLength];

while (bytesLeft > 0)
{

int nextPacketSize = (bytesLeft > bufferSize) ? bufferSize : bytesLeft;

bytesRead = netStream.Read(data, allBytesRead, nextPacketSize);
allBytesRead += bytesRead;
bytesLeft -= bytesRead;

}

// Save image to desktop
File.WriteAllBytes("C:\\Users\\Dan\\Desktop\\tcpimage.jpg", data);

// Clean up
netStream.Close();
client.Close();

最佳答案

大约 1.5 KiB 听起来像 1500 字节,“以太网在网络层允许的最大容量”。这是maximum transmission unit (mtu)强制您的网络堆栈将您的文件分成几个小数据包。

您需要调用 NetworkStream.Read循环读取每个到达的数据包。 MSDN 上有这方面的示例代码。

将此与 .NET 的默认行为相结合;合并较小的数据包以减少发送的数据包数量,您在发送较小的数据包时也会看到这种行为。这可以用 ServicePointManager.UseNagleAlgorithm 控制或者使用更小范围的套接字选项。

关于c# - 在 C# 中使用 TCPClient 和 NetworkStream 发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963052/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com