关于C#socket异步通信问题

v从自行车的 2016-01-28 04:51:06

/// <summary>
/// 发生数据至服务器
/// </summary>
/// <param name="msg"></param>
public void sendMessage(string msg)
{
try
{
msg = String.Format("[length={0}]{1}", msg.Length, msg);
//获取缓存
byte[] temp = Encoding.Unicode.GetBytes(msg);
try
{
//发送至服务器
streamToServer.Write(temp, 0, temp.Length);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

lock (streamToServer)
{
AsyncCallback callBack = new AsyncCallback(ReadComplete);
streamToServer.BeginRead(buffer, 0, BufferSize, callBack, null);
}
}
catch { }
}

/// <summary>
/// 数据读取
/// </summary>
/// <param name="ar"></param>
private void ReadComplete(IAsyncResult ar)
{
int bytesRead;
try
{
lock (streamToServer)
{
bytesRead = streamToServer.EndRead(ar);
}
if (bytesRead == 0) throw new Exception("没有数据");

string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
//清除缓存,避免脏读
Array.Clear(buffer, 0, buffer.Length);
//获取实际的字符串
string[] msgArray = handler.GetActualString(msg);

foreach (string ArrStr in msgArray)
{
Console.WriteLine("获取到的数据: {0}", ArrStr);
}
lock (streamToServer)
{
AsyncCallback callBack = new AsyncCallback(ReadComplete);
streamToServer.BeginRead(buffer, 0, BufferSize, callBack, null);
}
}
catch (Exception ex)
{
if (streamToServer != null) streamToServer.Dispose();
client.Close();
Console.WriteLine(ex.Message);
}
}

在上面二个函数里,第一个函数发生给服务器数据,然而调用第二个函数不断接收数据,我想问下怎么改成:调用第一个函数后,返回所以读取到的结果?在下新手,第一次来csdn发帖,多多指教!
...全文
159 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
v从自行车的 2016-01-28
  • 打赏
  • 举报
回复
引用 7 楼 xdashewan 的回复:
[quote=引用 3 楼 u012315552 的回复:] @xdashewan 在调用第一个函数执行完后 就调用第二个函数 就是读取数据,然而读取完后再从新调用自身 形成循环,让后直到数据读取完后就不在调用了...在这里我不清楚要怎么改
你举例说明一下吧,收到并打出信息,我没觉得你的代码有明显错误[/quote] 上面的代码是没有错,而且很好用,差不多和我想要的结果一致.但是我现在先要的是同步阻塞,可以在发生请求后return所有数据流上获得的数据
  • 打赏
  • 举报
回复
当然,stream.Read其实需要判断是否接收到完整的一个消息,需要反复Read。 不过主要是设计架构问题。比如说你不断Send消息,那么你不断“并发地”Read到的消息(这里是指循环读取stream并解析了至少一条完整的消息)怎么知道是对应哪一个 Send消息的呢? 这需要有一个信令协议设计过程。每条消息要有一个唯一的编号(例如顺序号),然后接收到的返回消息要能知道是返回给哪一条发送任务的。并且你的 SendMessage的时候就要预先将回调委托保存下来,这样当Read到返回消息的时候,要找出对应的哪一个回调委托方法来执行它。
xdashewan 2016-01-28
  • 打赏
  • 举报
回复
引用 3 楼 u012315552 的回复:
@xdashewan 在调用第一个函数执行完后 就调用第二个函数 就是读取数据,然而读取完后再从新调用自身 形成循环,让后直到数据读取完后就不在调用了...在这里我不清楚要怎么改
你举例说明一下吧,收到并打出信息,我没觉得你的代码有明显错误
v从自行车的 2016-01-28
  • 打赏
  • 举报
回复
@sp1234 您的意思就是说服务器用异步,而我想实现的那种效果客户端就用同步吗?
v从自行车的 2016-01-28
  • 打赏
  • 举报
回复
@sp1234 思路一下子都理清楚了
v从自行车的 2016-01-28
  • 打赏
  • 举报
回复
@xdashewan 在调用第一个函数执行完后 就调用第二个函数 就是读取数据,然而读取完后再从新调用自身 形成循环,让后直到数据读取完后就不在调用了...在这里我不清楚要怎么改
  • 打赏
  • 举报
回复
对于客户端代码来说,就直接使用同步阻塞方式就行了
stream.Send(data,1,  data.Length);
var len = stream.Read(buffer,0, Buffer.Length);
  • 打赏
  • 举报
回复
你的思路“调用第一个函数后,返回所以读取到的结果”也就是个同步阻塞的思路,思路决定了代码,所以没有必要贴什么“异步”代码。
xdashewan 2016-01-28
  • 打赏
  • 举报
回复
你如何界定这个“所有数据”

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧