【发布时间】:2012-05-17 13:13:36
【问题描述】:
我有一个代码(假设是一个简单的聊天应用程序),我使用带有同步的 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 是从对等方接收到的字符串。并且使用同步方式的输出必须是
你好
再见
但以异步方式,我将它作为一条消息而不是两条消息接收,所以它被打印出来
再见
此致, 佩曼·莫尔塔扎维
【问题讨论】:
标签: c# asynchronous tcp buffer