如题
服务器接收客户端过来的命令,然后开始发送数据
要保证客户端不断开的话就一直发送
现在一个客户端没问题,增加一个客户端就会出现发送错误的现象了
主要数据中有报文格式的一个要求,收到客户端一个命令,接收序号+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异步那个例子,真的很是郁闷啊
服务器接收客户端过来的命令,然后开始发送数据
要保证客户端不断开的话就一直发送
现在一个客户端没问题,增加一个客户端就会出现发送错误的现象了
主要数据中有报文格式的一个要求,收到客户端一个命令,接收序号+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异步那个例子,真的很是郁闷啊
当异步操作的时候,根据状态来进行操作。
比如: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
如果多客户端共享同一份数据,又要发不同的数据块。好像这是冲突的。
C#的异步socket已经是最简单的了。流程主要就2步。
1.创建listen端口并开始listen。
2.beginaccept,同时定义accept回调函数,其中上下文包含listen的socket
3.用上下文中listen的socket获取初始连接客户端发送的报文并启动beginrecieve开始正常连接,同时定义receive回调函数,其中上下文包含已与某客户端连接的socket
4.receive回调函数中获取报文信息,直接调用上下文中得socket操作发送即可。
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是一个编程者不能不知道的基本概念。
这里我看不出你想表达什么。任何程序都有一个逻辑设计,要看这个做逻辑设计的人脑筋是否清醒。如果你自己对业务需求毫无概念,只想要抄袭csdn上一个空洞的代码,那是毫无必要。你把这里空着,或者干脆删除就好了。你说不出逻辑需求,就不必要求别人给你抄一段垃圾代码出来。