TcpClient数据通讯丢包问题

问题描述

第一次写通讯,C#通过TcpClient连接到一个C++编号的TCP服务,但是连接上后,从C++服务端推送过来的时候有丢包,请问这个怎么解决,,..求写过通讯的高手们帮帮忙,下面是我整个TCP通讯的主要代码!客户端TCP连接类usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net.Sockets;usingSystem.Windows.Forms;usingSystem.Net;namespaceTcpMsg{publicclassLeafTCPClient{///<summary>///当前客户端名称///</summary>privatestring_Name="未定义";publicstringName{get{return_Name;}}publicvoidSetName(){if(_NetWork.Connected){IPEndPointiepR=(IPEndPoint)_NetWork.Client.RemoteEndPoint;IPEndPointiepL=(IPEndPoint)_NetWork.Client.LocalEndPoint;_Name=iepL.Port+"->"+iepR.ToString();}}///<summary>///TCP客户端///</summary>privateTcpClient_NetWork=null;publicTcpClientNetWork{get{return_NetWork;}set{_NetWork=value;SetName();}}///<summary>///数据接收缓存区///</summary>publicbyte[]buffer=newbyte[2048];///<summary>///断开客户端连接///</summary>publicvoidDisConnect(){try{if(_NetWork!=null&&_NetWork.Connected){NetworkStreamns=_NetWork.GetStream();ns.Close();_NetWork.Close();}}catch(Exceptionex){MessageBox.Show(ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);}}}}

//TCP通讯事件usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net.Sockets;namespaceTcpMsg{publicclassLeafEvent{///<summary>///数据接收事件///</summary>///<paramname="sender"></param>///<paramname="data"></param>publicdelegatevoidDataReceivedHandler(objectsender,byte[]data);///<summary>///发送数据事件///</summary>///<paramname="data"></param>publicdelegateboolDataSendHandler(byte[]data);///<summary>///捕获到IP数据包///作者:MaximusYe///添加时间:2013年9月16日///</summary>///<paramname="packet"></param>//publicdelegatevoidPacketReceived(Model.IPPacketpacket);}}

窗体程序,启动服务和接收回调处理publiceventLeafEvent.DataReceivedHandlerDataReceived;LeafTCPClientclient=null;privatevoidbtnConnect_Click(objectsender,EventArgse){if((client!=null)&&(client.NetWork.Connected)){client.DisConnect();}else{client=newLeafTCPClient();try{client.NetWork=newTcpClient();client.NetWork.Connect(txtip.Text.Trim(),Int32.Parse(txtport.Text));client.SetName();client.NetWork.GetStream().BeginRead(client.buffer,0,client.buffer.Length,newAsyncCallback(TCPCallBack),client);setBtnStatus();SetText("连接成功!");}catch(Exceptionex){client.DisConnect();MessageBox.Show(ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);}}setBtnStatus();}delegatevoidSetControl();privatevoidsetBtnStatus(){if((btnConnect.InvokeRequired)||(btnSend.InvokeRequired)){this.Invoke(newSetControl(setBtnStatus));}else{intcon=((client==null)||(!client.NetWork.Connected))?0:1;string[]constr={"连接","断开"};bool[]btnEnabled={false,true};btnConnect.Text=constr[con];btnSend.Enabled=btnEnabled[con];button1.Enabled=btnEnabled[con];}}privatevoidSetText(stringtext){txtMsg.Invoke(newMethodInvoker(delegate{txtMsg.AppendText(DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss")+"消息:"+text+Environment.NewLine+Environment.NewLine);}));}///<summary>///回调函数///</summary>///<paramname="ar"></param>privatevoidTCPCallBack(IAsyncResultar){LeafTCPClientclient=(LeafTCPClient)ar.AsyncState;if(client.NetWork.Connected){NetworkStreamns=client.NetWork.GetStream();try{byte[]recdata=newbyte[ns.EndRead(ar)];Array.Copy(client.buffer,recdata,recdata.Length);if(recdata.Length>0){if(DataReceived!=null){DataReceived.BeginInvoke(client.Name,recdata,null,null);//异步输出数据}ns.BeginRead(client.buffer,0,client.buffer.Length,newAsyncCallback(TCPCallBack),client);stringsdata;sdata=newstring(Encoding.Default.GetChars(recdata));SetText(sdata);}else{}}catch(Exceptionex){MessageBox.Show(ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);client.DisConnect();//lstClient.Remove(client);//BindLstClient();}}else{SetText("连接已被关闭!");}}publicboolSendData(stringmsg){try{if(client.NetWork.Connected==false){SetText("连接已被关闭!");returnfalse;}SetText("发送消息:"+msg);byte[]data;data=Encoding.GetEncoding("GB2312").GetBytes(msg);client.NetWork.GetStream().Write(data,0,data.Length);returntrue;}catch(Exceptionex){MessageBox.Show(client.Name+":"+ex.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);returnfalse;}}

解决方案

解决方案二:
根本不是丢包,而是楼主不了解TCP通讯的特点,它是基于流的,所以接收数据的时候,有可能不是一下子收全的,而是分批到达,楼主的代码没有这方面的处理.
解决方案三:
同意#1楼。发送端可能分3次发送2000、1000、500个字节,而接收端可能分4次接收到500、1800、700、500个字节。因为TCP数据发送是一个非常复杂的过程,为了高效同时又不滥占带宽,接收端你看到的结果会按照windows的规则自动合并或者分包。只要你使用TCP,那么你就应该自定义消息信令格式,接收端可以知道消息什么时候结束。例如HTTP(当然,这也是基于TCP的)消息头和消息体分别是以两个连续的“换行回车”结束的。接收端需要在分解到消息结束标志时,才可能去执行什么DataReceived.BeginInvoke代码。不能提前去丢数据输出。

时间: 2024-09-06 22:51:38

TcpClient数据通讯丢包问题的相关文章

tcp-TCP读设备大量数据产生丢包

问题描述 TCP读设备大量数据产生丢包 我在用C++的socket实现了一个TCP的接收程序,需要将设备的数据保存下来.可是设备传来的数据量很大,可能是我线程设计的不合理,好吧,是我根本没有线程以及网络编程基础,所以数据产生丢失.哪位前辈能指点一下我该怎么分配我的线程.设备工作50HZ,一秒存的TXT文件大约5M.谢谢了. 解决方案 Tcp接收数据的话,要经过网络层,而网络层的最大传输单元是1500个字节,具体怎么分配线程不太懂了,你可以参考下刚才所说的

class-用serialport类写的串口助手在接受到4K左右的数据时会发生丢包现象,怎么解决

问题描述 用serialport类写的串口助手在接受到4K左右的数据时会发生丢包现象,怎么解决 用serialport类写的串口助手在接受到4K左右的数据时会发生丢包现象,接收数据发生丢包现象的原因是什么,怎么解决呢 解决方案 整包都丢了?还是只丢了一部分? 解决方案二: 丢了一部分,接收聂小孟的传输数据没问题,可是接受蓝牙数据就会出错,而聂小孟的接受蓝牙数据又不会出错,我也是醉了,你知道怎么办嘛 解决方案三: 不确定你的问题,显然你给的信息太少. 但你就算全给出来我也不会,毕竟我没用过seri

线程-UDP传输文件,通过网线直连,低速传输正常,高速传输丢包的问题

问题描述 UDP传输文件,通过网线直连,低速传输正常,高速传输丢包的问题 用UDP传输视频文件,VC发送数据到安卓端,安卓端监听端口接收数据,采用网线直连,排除网络原因造成的丢包.当VC发送数据延时50ms(大概几百K每秒的速度发包),JAVA端能正确接收.可是不延时50ms发送时(大概2M/S的速度发包)JAVA端接收就出现丢包.JAVA开了两个线程,一个线程接收并放到缓冲队列,另一个线程从缓冲队列取出数据写入U盘.缓冲队列大小也比发送的文件要大,也不可能是缓冲队列不够大的问题.希望得到大神指

Socket编程 (异步通讯,解决Udp丢包) - Part4

原文http://www.cnblogs.com/zengqinglei/archive/2013/05/15/3079007.html Socket编程 (异步通讯,解决Udp丢包) 对于基于socket的udp协议通讯,丢包问题大家应该都见怪不怪了,但我们仍然希望在通讯方面使用Udp协议通讯,因为它即时,消耗资源 少,响应迅速,灵活性强无需向Tcp那样建立连接消耗很长的时间等等很有优势的理由让我们对Udp通讯寄予了厚望.但它也存在一个不好的特点,经常丢包是 时常发生的事.可能各位大侠已经有了

通信-NS3仿真中统计数据包的丢包率、端到端延迟以及协议开销等相关问题?谢谢啦!!只有1C币了。。

问题描述 NS3仿真中统计数据包的丢包率.端到端延迟以及协议开销等相关问题?谢谢啦!!只有1C币了.. NS3仿真中如何实现对mesh通信中数据包的丢包率.端到端延迟以及协议开销等的统计? 最好有源码的,谢谢啦!! 只有1C币了.. 解决方案 只有一个C币不是问题,CSDN支持充值的! 这种通信统计如果 NS3 系统没有提供这样的功能,就只能自己写一个测试系统,发送测试数据.

游戏-Azure 国内版本北京和上海数据中心和 Azure 国际版香港中转互联后 偶尔会丢包 20%

问题描述 Azure 国内版本北京和上海数据中心和 Azure 国际版香港中转互联后 偶尔会丢包 20% 加速游戏用 用户拨入国内数据中心,通过 Azure 香港中转可以降低 ping 到合理值,而且会稳定. 但是有个问题,不间断的会丢包 20%左右,一个小时左右出现一次. 有人知道什么原因吗? 解决方案 Hi, 据我所知,如果将国内版和国际版互联可能会存在性能上的影响,我们首先还是需要分析丢包的原因,丢包确定是在这个VPN产生的吗?会不会在通道前或者其他地方出现呢?或许这个可能是因为GFW(中

数据-自己写的串口助手程序,在不同电脑运行,有的不丢包,有的丢包的,这么一个神奇的问题,你们有遇到过吗

问题描述 自己写的串口助手程序,在不同电脑运行,有的不丢包,有的丢包的,这么一个神奇的问题,你们有遇到过吗 串口助手程序,在我的电脑上正常运行,不丢包,可是在其他同事的电脑上就会丢包,数据出错,急急急,求解答 解决方案 我也遇到过不知怎么回事

解决网络丢包问题及故障判断方法

  我们首先来认识一下什么是丢包,以及什么样的现象被成为是网络丢包: 数据在INTERNET上是以数据包为单位传输的,每包nK,不多也不少.这就是说,不管网络线路有多好.网络设备有多强悍,你的数据都不会是以线性(就象打电话一样)传输的,中间总是有空洞的.数据包的传输,不可能百分之百的能够完成,因为种种原因,总会有一定的损失.碰到这种情况,INTERNET会自动的让双方的电脑根据协议来补包和重传该包.如果网络线路好.速度快,包的损失会非常小,补包和重传的工作也相对较易完成,因此可以近似的将所传输的

网络丢包率是什么意思

在我们网络上形成的数据包通过途径传输到另一个数据库上面,一般通过网络传输的过程中会因为一些原因比如距离过大而产生小部分数据包被丢失,而大部分数据包被成功传输到终端数据库上.这样就形成了一个网络丢包的过程.而其中丢包的大小和传输数据包的大小就是网络丢包率.比如工厂在A地买了一车货,然后运送到B地,其中因为搬运工搬运和其他原因造成这批货和在A地的所测量的数值要少一些,这个过程就是被丢失的货物的故此,也就是网络中网络丢包,而丢失的货物和货物的总量的比值就是网络丢包率.通常这些只是磨损消耗,属于很正常的