gpt4 book ai didi

c# - 我的服务器(TcpClient、TcpListener)中有一个黑洞

转载 作者:行者123 更新时间:2023-11-30 12:53:22 24 4
gpt4 key购买 nike

我正在尝试构建一个服务器来接收客户端通过网络发送的文件。如果客户端决定一次发送一个文件,没有问题,我会按预期收到文件,但如果它尝试发送多个文件,我只会收到第一个。

这是服务器代码:我为每个连接的客户端使用一个线程

public void ProcessClients()
{
while (IsListening)
{
ClientHandler clientHandler = new ClientHandler(listener.AcceptTcpClient());
Thread thread = new Thread(new ThreadStart(clientHandler.Process));
thread.Start();
}
}

以下代码是ClientHandler类的一部分

public void Process()
{
while (client.Connected)
{
using (MemoryStream memStream = new MemoryStream())
{
int read;
while ((read = client.GetStream().Read(buffer, 0, buffer.Length)) > 0)
{
memStream.Write(buffer, 0, read);
}

if (memStream.Length > 0)
{
Packet receivedPacket = (Packet)Tools.Deserialize(memStream.ToArray());
File.WriteAllBytes(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), Guid.NewGuid() + receivedPacket.Filename), receivedPacket.Content);
}
}
}
}

在第一次迭代中,我收到了第一个文件,但之后我什么也没收到。我尝试在每次迭代结束时使用 Thread.Sleep(1000),但没有任何运气。

在另一边我有这段代码(给客户)

.
.
client.Connect();
foreach (var oneFilename in fileList)
client.Upload(oneFilename);
client.Disconnect();
.
.

方法上传:

public void Upload(string filename)
{
FileInfo fileInfo = new FileInfo(filename);
Packet packet = new Packet()
{
Filename = fileInfo.Name,
Content = File.ReadAllBytes(filename)
};

byte[] serializedPacket = Tools.Serialize(packet);

netStream.Write(serializedPacket, 0, serializedPacket.Length);
netStream.Flush();
}

netStream (NetworkStream) 在 Connect 方法上打开,在 Disconnect 上关闭。

黑洞在哪里?我可以尝试发送多个对象吗?

感谢您的宝贵时间。

最佳答案

我猜测如果客户端上传多个文件,您的循环会在服务器端将整个流作为单个文件读取。 “文件之间的分隔符”在哪里?服务器如何知道一个在哪里结束,另一个从哪里开始?

关于c# - 我的服务器(TcpClient、TcpListener)中有一个黑洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534986/

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