Socket如何实现一个客户端连接多个服务器,用异步通信的方法编写的

小小回忆录 2015-03-20 02:58:59
private void ReadCallBack(IAsyncResult ar)
{
var state = (StateObject) ar.AsyncState;
if ((state.Client == null) || (!state.Client.Connected))
return;
var networkStream = state.Client.GetStream();

try
{
var number= networkStream.EndRead(ar);
state.BytesRead += number;
if (number > 0)
{
var by = new byte[number];
Array.Copy(state.Buffer, 0, by, 0, number);
Rec(by);//这个是一个处理服务器传回的数据,
networkStream.BeginRead(state.Buffer, 0, StateObject.BufferSize, ReadCallBack, state);
}

else
{
networkStream.Close();
state.Client.Close();
}



}
catch (Exception)
{
//_tcp1.Close();
//_networkStream.Close();

}
}


private void AsynRead(TcpClient tcpClient)
{
var state = new StateObject {Client = tcpClient};
var stream = tcpClient.GetStream();
if (stream.CanRead)
{
try
{
var ar = stream.BeginRead(state.Buffer, 0, StateObject.BufferSize, ReadCallBack, state);
}
catch (Exception)
{
// ignored
}
}
}


private void ConnectCallBack(IAsyncResult ar)
{
AllDone.Set();
var t = (TcpClient) ar.AsyncState;
try
{
t.EndConnect(ar);
}
catch (Exception)
{
// ignored
}
}
...全文
732 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小回忆录 2015-03-23
  • 打赏
  • 举报
回复
引用 6 楼 dongxinxi 的回复:
.Net中的多态、抽象、委托==都要用熟,然后再去看看设计模式(不要生搬硬套),学习一些思想
嗯,我多想想
  • 打赏
  • 举报
回复
.Net中的多态、抽象、委托==都要用熟,然后再去看看设计模式(不要生搬硬套),学习一些思想
  • 打赏
  • 举报
回复
引用 4 楼 junleejun 的回复:
一共有好几个方法,我相当于又重写了一遍,虽然能够实现,但总觉得不好,就是不知道如何改能让重复的方法少写
这种情况先不用迷茫,先用最笨最可靠的方法实现,然后初步测试。最后再考虑如何重构
小小回忆录 2015-03-23
  • 打赏
  • 举报
回复
一共有好几个方法,我相当于又重写了一遍,虽然能够实现,但总觉得不好,就是不知道如何改能让重复的方法少写
小小回忆录 2015-03-23
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
既然你连一个会连 连多个也不过就是多建几个socket对象分别去连不同的服务器呗
这个我确实建立了两个Client对象,但是连接回调,读取回调,这些方法我还需要再重写一遍吗?比如读取回调中,怎样改客户端能适合多个连接啊 private void ReadCallBack(IAsyncResult ar) { var state = (StateObject) ar.AsyncState; if ((state.Client == null) || (!state.Client.Connected)) return; var networkStream = state.Client.GetStream(); try { var number= networkStream.EndRead(ar); state.BytesRead += number; if (number > 0) { var by = new byte[number]; Array.Copy(state.Buffer, 0, by, 0, number); Rec(by); networkStream.BeginRead(state.Buffer, 0, StateObject.BufferSize, ReadCallBack, state); } else { networkStream.Close(); state.Client.Close(); } } catch (Exception) { //_tcp1.Close(); //_networkStream.Close(); } }
於黾 2015-03-20
  • 打赏
  • 举报
回复
既然你连一个会连 连多个也不过就是多建几个socket对象分别去连不同的服务器呗
於黾 2015-03-20
  • 打赏
  • 举报
回复
有一个服务器,就需要一个socket对象

111,098

社区成员

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

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

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