我有一个代码(假设是一个简单的聊天应用程序),我使用了同步的 Tcp。但是由于异步方式更好,虽然它更难设置,所以我决定将方式从同步更改为异步。但现在我在使用异步时遇到了一些问题。
- 缓冲区大小:我知道我们需要考虑有限大小的字节才能从对等方获取字节。我读了很多文章,但我的问题没有解决,我有一个非常简单但毫无价值的方法来解决这个问题,在每条消息的末尾加上一个字符;然后接收者可以理解何时完全接收到消息。但我有另一个问题阻止我进一步执行这种方法来解决它对我的另一个问题。
让我通过以下代码解释我的问题:
public void Send(byte[] message, Socket connection)
{
connection.BeginSend(message,
0,
message.Length,
SocketFlags.None,
new AsyncCallback(OnSend),
connection);
}
在 OnSend 方法上,我只使用connection.EndSend(result),其中结果是 IAsyncResult。但是当我像下面的代码那样调用 Send 方法两次时, OnReceive 回调将把它们作为一条消息接收。
Send(Encoding.Unicode.GetBytes("Hello"));
Send(Encoding.Unicode.GetBytes("Bye"));
我的 OnReceiveMethod 将使用Console.WriteLine(message); 其中 message 是从对等方接收到的字符串。并且使用同步方式的输出必须是
你好
再见
但是以异步方式,我将其作为一条消息而不是两条消息接收,因此将其打印
你好再见
此致,佩曼·莫尔塔扎维