关于SOCKET 异步接收数据的问题

zm03173225 2012-10-12 09:52:24
一个关于接收设备数据的问题,我写了个服务器端,接收设备传输的数据,具体的工作原理是这样的,设备每隔一分钟请求一次服务器,服务器接收到请求之后建立连接,向客户端回发一次数据这时候设备就会再发一条数据上来,搞不清楚什么时候断开,反正设备隔一分钟之后就会重新连接,重复上述过程。
我现在的问题是设备数比较少的时候程序运行正常,但是设备数比较多时候经常发生设备连接之后我也发送了请求,倒是设备的第2条数据我接收不到,导致设备遗漏了很多信息。
下面我贴出我的代码希望高手们给与指点,如果解决可以再开帖加100分,很急 谢谢



///开始监听
private void StartTCP()
{
try
{
//创建监听服务器,采用TCP协议
m_TCPSocketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建监听端口,服务器上任何IP的指定端口都监听
int nPort = int.Parse(CXml.GetParameter("TcpPort"));
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, nPort);
//绑定并监听指定的地址
m_TCPSocketServer.Bind(ipEndPoint);
m_TCPSocketServer.Listen(100);
//接收请求客户端
m_TCPSocketServer.BeginAccept(new AsyncCallback(OnTCPAccept), null);
}
catch (Exception ex)
{
m_Log.Error(ex.Message + " StartTCP");
}
}

///接收客户端的请求
private void OnTCPAccept(IAsyncResult ar)
{
try
{
Socket clientSocket = m_TCPSocketServer.EndAccept(ar);
//完成接收后,开始等待后续的请求接入
m_TCPSocketServer.BeginAccept(new AsyncCallback(OnTCPAccept), null);
//一旦建立连接,那么开始接收客户端发送的信息
clientSocket.BeginReceive(byteDataTcp, 0, byteDataTcp.Length, SocketFlags.None,
new AsyncCallback(OnTCPReceive), clientSocket);
}
catch (Exception ex)
{
m_Log.Error(ex.Message + " OnTCPAccept");
}
}

///接收设备发送的数据信息
private void OnTCPReceive(IAsyncResult ar)
{
Socket clientSocket = (Socket)ar.AsyncState;

label5.Text = "接收";
try
{
int read = clientSocket.EndReceive(ar);
//read为0的话表明已经断开,大于0的话获取接收数据后继续监听
if (read > 0)
{
////获取客户端发来的信息
dataBag.AddRange(byteDataTcp);
byte[] message = dataBag.ToArray(); //需要发送的信息
WatchMessage msgReceived = new WatchMessage(message);

switch (msgReceived.Command)
{
case "CONNECT":
//创建客户
DealWithTcpClient(msgReceived.DeviceID);
//txtShow.Text = txtShow.Text + "\r\n" + "收到数据:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + msgReceived.ReceiveMessage;
message=msgReceived.ToByte();
Thread.Sleep(100);
//回发数据给客户端
clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(OnTCPSend), clientSocket);
m_ACount++;
label7.Text = m_ACount.ToString();

break;
case "PING":

break;
case "LCSINFO":
DealWithTcpClient(msgReceived.GpsData.DeviceID);
//txtShow.Text = txtShow.Text + "\r\n" + DateTime.Now.ToString("HH:mm:ss") + ":" + msgReceived.ReceiveMessage;
m_BCount++;
label8.Text = m_BCount.ToString();
if (msgReceived.GpsData.GpsEffective)
{
//插入数据位置信息
SaveDataBase(msgReceived.GpsData);
}
break;
}
byteDataTcp=new byte[1024];
dataBag.Clear();
//继续接收数据
clientSocket.BeginReceive(byteDataTcp, 0, byteDataTcp.Length, SocketFlags.None, new AsyncCallback(OnTCPReceive), clientSocket);
}
}
catch (Exception ex)
{
dataBag.Clear();//清空数据包中的元素
m_Log.Error(ex.Message + " OnTCPReceive");
}
}

/// <summary>
/// TCP数据接收回发
/// </summary>
/// <param name="ar"></param>
public void OnTCPSend(IAsyncResult ar)
{
try
{
Socket client = (Socket)ar.AsyncState;
client.EndSend(ar);
}
catch (Exception ex)
{
m_Log.Error(ex.Message + " OnTCPSend");
}
}



...全文
266 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
KJ_Wang 2012-10-13
  • 打赏
  • 举报
回复
还有你贴出来的代码没有死循环语句,如果你有死循环语句,在中间加Thread.sleep(你定义的时间);
KJ_Wang 2012-10-13
  • 打赏
  • 举报
回复
换一种方式吧,用线程,或许好处理很多,本人就比较讨厌异步(异步也是多线程),你用多线程,然后设置多个断点,在本机上进行多次模拟测试。
第二:建议用一些抓包工具
第三:打印出来(Console下进行测试或者txt文件进行测试,如果你没时间观察,你最好选择txt文件)
Pigeon汪 2012-10-13
  • 打赏
  • 举报
回复
为什么"设备隔一分钟之后就会重新连接"呢?如果是TCP连接,只要第一次连接上,以后就无需再重新连接
popo0762 2012-10-12
  • 打赏
  • 举报
回复
m_TCPSocketServer.BeginAccept(new AsyncCallback(OnTCPAccept), null);
把这一行,写在try_catch之后,不然,一旦前一个连接出现问题,服务器将无法接受其他连接。

zm03173225 2012-10-12
  • 打赏
  • 举报
回复
哦 谢谢 设备的请求我都收到了 数据也回发了 就是没有再收到数据,所以想找找原因
bdmh 2012-10-12
  • 打赏
  • 举报
回复
这东西根本不是看两眼代码就能分析清楚的,你必须有足够的异步经验,调试经验,socket经验
chenjly 2012-10-12
  • 打赏
  • 举报
回复
顶楼主!我也遇到这方面的问题,不晓得肿么解决……
biaohe-rain 2012-10-12
  • 打赏
  • 举报
回复
我也遇到这样的问题!
sofant 2012-10-12
  • 打赏
  • 举报
回复
所有的客户端连接,你共用同一个接收缓冲区?
一个线程刚接收好,一个线程就byteDataTcp=new byte[1024];
R3333 2012-10-12
  • 打赏
  • 举报
回复
看你的描述,猜测可能是并发引起的问题,同时请求服务器数量太多。你客户端在建立链接失败后,是怎么处理?你服务端又是如何处理多组数据接收的?

110,538

社区成员

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

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

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