C# 使用TCP发送多个字符串速度太快,我该如何等待?

C# 使用TCP发送多个字符串速度太快,我该如何等待?,c#,.net,tcp,listbox,async-await,C#,.net,Tcp,Listbox,Async Await,因此,我试图将列表框中的所有项目发送到具有另一个列表框的服务器。 我无法访问服务器的代码,我所能做的就是连接并向其发送字符串 到目前为止,我所做的是,我已经连接到它,我可以发送单个字符串而没有任何问题,现在,当我尝试发送列表框中的所有项目时,它的速度非常快,如果有意义的话,一些字符串将作为一个包发送 想象一个这样的列表 Joss Nota Pioneer PRB Python Tomcar Toyota Joss Nota PioneerPRBPython Tomcar Toyota 当我从

因此,我试图将列表框中的所有项目发送到具有另一个列表框的服务器。 我无法访问服务器的代码,我所能做的就是连接并向其发送字符串

到目前为止,我所做的是,我已经连接到它,我可以发送单个字符串而没有任何问题,现在,当我尝试发送列表框中的所有项目时,它的速度非常快,如果有意义的话,一些字符串将作为一个包发送

想象一个这样的列表

Joss
Nota
Pioneer
PRB
Python
Tomcar
Toyota
Joss
Nota
PioneerPRBPython
Tomcar
Toyota
当我从客户机向服务器发送数据时,服务器接收到的数据是这样的

Joss
Nota
Pioneer
PRB
Python
Tomcar
Toyota
Joss
Nota
PioneerPRBPython
Tomcar
Toyota
因为它发送的太快了。 我怎样才能让它慢下来?我想使用async和Wait,但不确定如何使用

private void SendAll()
        {
            foreach (string Book in lbMain.Items)
            {
                string[] splitter = Book.Split(new string[] { "###" }, StringSplitOptions.None);
                Book aBook = new Book();

                aBook.Title = splitter[0];
                aBook.Author = splitter[1];
                aBook.Genre = splitter[2];

                if (splitter.Length < 4)
                    aBook.IsAvailable = null;
                else
                    aBook.IsAvailable = Convert.ToBoolean(splitter[3]);





                //Create a network stream to get all the data that comes and goes through the client.
                NetworkStream nwStream = Client.GetStream();

                //Convert out string message to a byteArray because we will send it as a buffer later. 
                //IMPORTANT UNICODE BECAUSE .net uses utf8 by default
                //
                byte[] bytesToSend = Encoding.Unicode.GetBytes(aBook.ToString());

                //Write out to the console what we are sending.
                Console.WriteLine("Sending: " + aBook.ToString());

                //Use the networkstream to send the byteArray we just declared above, start at the offset of zero, and the size of the packet we are sending is the size of the messages length.
                nwStream.Write(bytesToSend, 0, bytesToSend.Length);

                //Thread.Sleep(1000);
            }
        }
private void SendAll()
{
foreach(lbMain.Items中的字符串簿)
{
string[]splitter=Book.Split(新字符串[]{“#####”},StringSplitOptions.None);
Book aBook=新书();
aBook.Title=拆分器[0];
aBook.Author=splitter[1];
aBook.Genre=splitter[2];
if(拆分器长度<4)
aBook.IsAvailable=null;
其他的
aBook.IsAvailable=Convert.ToBoolean(拆分器[3]);
//创建一个网络流以获取通过客户端传入和传出的所有数据。
NetworkStream nwStream=Client.GetStream();
//将字符串消息转换为byteArray,因为我们稍后会将其作为缓冲区发送。

//重要的UNICODE,因为.net默认使用utf8 // byte[]bytesToSend=Encoding.Unicode.GetBytes(aBook.ToString()); //向控制台写出我们发送的内容。 Console.WriteLine(“发送:+aBook.ToString()); //使用networkstream发送我们刚才声明的byteArray,从零开始,我们发送的数据包的大小就是消息长度的大小。 Write(bytesToSend,0,bytesToSend.Length); //睡眠(1000); } }
这里的问题不是速度,放慢速度是不好的。问题在于TCP是一种流协议——您发送的字节与接收的字节在单个操作的大小方面并不匹配。可以保证的是,相同的字节序列将以相同的顺序到达。相反,您需要实现一个“框架”协议,即一些区分不同项目的机制。因为您使用的是文本,所以一个非常实用的选项是使用CRLF终止每个文本。服务器应该一直读取,直到有一个CRLF(即完整帧),然后解释这些字节

在二进制协议中,长度前缀比终止符(sentinel)值更常见


“重要的UNICODE,因为.net默认使用utf8”-这不是真的;一些API可能使用utf8作为默认编码,但是.net作为内部实现主要关注utf-16。。在发送数据包之间让它休眠时,工作正常@他们高兴地买了一辆散热器坏了的汽车,在很短的行程中让它睡觉,它的工作状态也很好。我想说的是:你的方法从根本上被打破了,现在你正在使用一种不可靠的计时副作用——本质上是一种被迫的比赛条件——作为一种攻击。解决办法是正确地实施框架。我将如何使用框架?@他们高兴地从字面上理解了我所说的答案;它不需要太复杂-只需在每个条目之后添加一个CRLF(
\r\n
,使用C#string literal语法)就足够了;然后服务器知道每个条目的结束位置;在网络术语中:由CRLF终止的每个字节块都可以解释为一个“帧”。请注意,“框架”可以采取不同的形式,这取决于需要什么-它并不总是与CRLF相关。只是:那在这里就行了。哦!我以为CRLF是另一种类似于某种课程的东西,谢谢你的澄清!