C#异步服务器端如何实现向不同客户端发送不同数据

缭绕飘渺 2012-03-16 10:41:20
如题
服务器接收客户端过来的命令,然后开始发送数据
要保证客户端不断开的话就一直发送
现在一个客户端没问题,增加一个客户端就会出现发送错误的现象了
主要数据中有报文格式的一个要求,收到客户端一个命令,接收序号+1
发送出去一个命令,发送序号+1
双方根据序号来判断接收报文是否丢失

我现在是一个异步的过程
如何实现不同客户端连接过来后发送的序号不会错误
就像一个客户端一个线程一样,对其中的发送的数据互不影响
public void StartThread()
{
..........
listenersocket.BeginAccept(new AsyncCallback(AcceptCallback), listenersocket);
............

}

private void AcceptCallback(IAsyncResult ar)
{
.......
listenersocket.BeginAccept(new AsyncCallback(AcceptCallback), listenersocket);
.......
handler.BeginReceive (state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback (ReadCallback), state);
......
}

private void ReadCallback(IAsyncResult ar)
{
......//这里组织要发送的数据和发送的序列号
//如果增加多个客户端,如何实现数据按照不同客户端发送不同的内容
//
handler.BeginSend (state.buffer, 0, state.buffer, 0, new AsyncCallback (SendCallback), handler);
.......

}

路过的来指点下,异步搜遍网络,没发现真正实质的例程,基本是抄MSDN异步那个例子,真的很是郁闷啊
...全文
262 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用楼主 mervyn807 的回复:]
private void ReadCallback(IAsyncResult ar)
{
......//这里组织要发送的数据和发送的序列号
//如果增加多个客户端,如何实现数据按照不同客户端发送不同的内容
//
handler.BeginSend (state.buffer, 0, state.buffer, 0, new AsyncCallback (SendCallback), handler);
.......

}
[/Quote]

这里我看不出你想表达什么。任何程序都有一个逻辑设计,要看这个做逻辑设计的人脑筋是否清醒。如果你自己对业务需求毫无概念,只想要抄袭csdn上一个空洞的代码,那是毫无必要。你把这里空着,或者干脆删除就好了。

你说不出逻辑需求,就不必要求别人给你抄一段垃圾代码出来。
  • 打赏
  • 举报
回复
任何一个讲求一点效率的程序,不管是需要流畅地处理用户交互和动画显示的客户端,还是一个稍高负载的服务器端,都需要大量多线程操作。偶尔地,需要lock一些数据以保证一致性。lock操作当然是是越少越好,但是肯定需要,所以不能不知。
  • 打赏
  • 举报
回复
管理序号只要加个锁就成了,例如
private ulong num=0;
private object lock= new object();

public void yourMethod(....)
{
Msg s;
....
lock(lock)
{
if(num== ulong.MaxValue)
num=0;
else;
num++;
s= 使用num参数产生你要发送的消息(num,.....);
}
Send(s);
}


修改和读取使用num的时候只要lock就行了。

lock是一个编程者不能不知道的基本概念。
铜臂阿铁木 2012-03-16
  • 打赏
  • 举报
回复
或者服务端持有一个Mapping来映射客户端状态。
如果多客户端共享同一份数据,又要发不同的数据块。好像这是冲突的。
gomoku 2012-03-16
  • 打赏
  • 举报
回复
给每个客户创建一个数据结构,用来保存状态。
当异步操作的时候,根据状态来进行操作。
比如:

public class StateObject
{
public Socket socket = null; // 客户所对应的Socket
public const int BUFFER_SIZE = 64*1024;
public byte[] buffer = new byte[BUFFER_SIZE];
public int offset = 0;

public int runningNumber; //序列号
}


异步以及StateObject的使用,可以借鉴下贴4楼的例子:
http://topic.csdn.net/u/20120312/20/434850ff-8eed-4851-afdb-c07cc8a82773.html
shux02 2012-03-16
  • 打赏
  • 举报
回复
你的理解出问题了,readcallback回调函数对应的已经是某个特定的客户端了,你所需要做得仅仅是获取发送指令再判断指令序号处理即可。
C#的异步socket已经是最简单的了。流程主要就2步。
1.创建listen端口并开始listen。
2.beginaccept,同时定义accept回调函数,其中上下文包含listen的socket
3.用上下文中listen的socket获取初始连接客户端发送的报文并启动beginrecieve开始正常连接,同时定义receive回调函数,其中上下文包含已与某客户端连接的socket
4.receive回调函数中获取报文信息,直接调用上下文中得socket操作发送即可。

111,126

社区成员

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

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

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