本人用C#写的程序,放到PDA中运行,其中有和工控机通讯,扫描次数增多就会报出错。
一开始是报
百度后 需要安装NETCFv35.Messages.zh-CHS.cab,
然后不报错误,开始报Sicket的问题 如图
本人仔细查看本人的代码没有问题。Sicket该关闭的关闭了。
本人PDA上的代码
一开始是报
百度后 需要安装NETCFv35.Messages.zh-CHS.cab,
然后不报错误,开始报Sicket的问题 如图
本人仔细查看本人的代码没有问题。Sicket该关闭的关闭了。
本人PDA上的代码
try { Loading("正在处理扫描数据...",true); //发送消息 string msg = string.Format("{0}/{1}/{2}/{3}/{4}/{5}/{6}/{7}", tabEquipList.TabPages[cur].Tag.ToString(), barcode, txtDateList[cur].Text, txtSftList[cur].Tag.ToString(), txtGrpList[cur].Tag.ToString(), matid,leftOrRight, result); Loading("正在连接消息服务器...",true); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(serverIp); Loading("正在发送消息...", true); socket.Send(Encoding.Default.GetBytes(msg)); //接收消息 if (result == "验证通过") { byte[] byteMessage = new byte[256]; Loading("正在等待反馈...", true); //启动心脏计数器 StartHeart(); int rec = socket.Receive(byteMessage);//等待服务器反馈消息 recFlag = true; if (rec > 0) { lblMsgList[cur].Text = Encoding.Default.GetString(byteMessage, 0, byteMessage.Length); if (lblMsgList[cur].Text.Contains("成功")) { scanCount -= 1;//可用的扫描次数减一 if (leftOrRight == "L") { txtLeftBarCodeList[cur].Text = barcode; txtLeftBarCodeList[cur].ForeColor = Color.Red; txtLeftBarCodeList[cur].ForeColor = System.Drawing.Color.Black; lblScanMsg.BackColor = Color.Green; lblScanMsg.Visible = true; } else { txtRightBarCodeList[cur].Text = barcode; txtRightBarCodeList[cur].ForeColor = Color.Red; txtRightBarCodeList[cur].ForeColor = System.Drawing.Color.Black; this.lblScanMsg.BackColor = Color.Blue; this.lblScanMsg.Visible = true; } PlaySound("添加成功.wav"); } } } else { lblMsgList[cur].Text = result.Trim(); // PlaySound(result+".wav"); PlaySound("Error.wav"); } } } catch(Exception ex) { MsgHelper.ShowMsg("出错啦!"+ex.Message.ToString()); PlaySound("Error.wav"); //lblMsgList[tabEquipList.SelectedIndex].Text = "出错啦!" + ex.Message.ToString(); } finally { if (socket != null) socket.Close(); WcfSystem.DisposeWcf(); EndLoading(""); } int count = 0; public void StartHeart() { count = 0; recFlag = false; heart = new System.Threading.Timer(new System.Threading.TimerCallback(StartHeart_CallBack), null, 0, 1000); } private void StartHeart_CallBack(object sender) { count++; if (count >= 30) { if (recFlag == false) { socket.Shutdown(SocketShutdown.Both); socket.Close(); heart.SafeDispose(); } } }
工控机上的代码:
public CuringProMain thisf = null; //操作窗口 public Socket listener; //申明一个套接 public delegate void DelegateWriteScanResult(string barcode, string result, bool isWriteToLog); public MySocket(CuringProMain thisf) { this.thisf = thisf; } //侦听方法 public void Listen() { try { int nPort = 56789; //获取本地Ip IPAddress ServerIp = PublicVar.Common.GetIP(); IPEndPoint iep = new IPEndPoint(ServerIp, nPort);////ip地址和端口号组成的 listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义套接字类型; listener.Bind(iep);//绑定ip和端口; listener.Listen(10); listener.BeginAccept(new AsyncCallback(AcceptCallBack), listener); //Accept_Async(); } catch (Exception ex) { PublicVar.Common.writeLog("创建客户端连接失败!" + ex.Message.ToString()); } } private void AcceptCallBack(IAsyncResult ar) { try { if (isRun) { listener.BeginAccept(new AsyncCallback(AcceptCallBack), listener); Socket sok = (Socket)ar.AsyncState; Socket client = sok.EndAccept(ar); StateObject state = new StateObject(); state.workSocket = client; client.BeginReceive(state.bytedata, 0, StateObject.bufferSize, 0, new AsyncCallback(ReadCallback), state); } } catch (Exception ex) { //thisf.Invoke(new DelegateWriteScanResult(thisf.WriteScanResult), new object[] { "", "创建客户端连接失败!" + ex.Message.ToString(), true }); } } //异步接收回调函数 public void ReadCallback(IAsyncResult ar) { StateObject state = null; Socket handler = null; string msg = "1"; try { state = (StateObject)ar.AsyncState; handler = state.workSocket; int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { string strmsg = Encoding.Default.GetString(state.bytedata, 0, bytesRead); state.sb.Append(strmsg); msg = state.sb.ToString(); string result = ""; //处理扫描的 result = thisf.DealScanBarCode(msg); if (result != "11") { //反馈处理结果 byte[] bf; bf = Encoding.Default.GetBytes(result); handler.Send(bf, SocketFlags.None); } else { handler.Close(); } } else { handler.BeginReceive(state.bytedata, 0, StateObject.bufferSize, 0, new AsyncCallback(ReadCallback), state); } } catch (Exception ex) { thisf.Invoke(new DelegateWriteScanResult(thisf.WriteScanResult), new object[] { "", "接收或反馈消息失败!消息内容:" + msg + ex.Message.ToString(), true }); try { //反馈处理结果 byte[] bf; bf = Encoding.Default.GetBytes("扫描失败!" + ex.Message.ToString()); handler.Send(bf, SocketFlags.None); } catch { } } } //异步发送 private void Send(Socket handler, string data) { byte[] byteData = Encoding.Default.GetBytes(data); handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); } //异步发送回调函数 private void SendCallback(IAsyncResult ar) { try { Socket handler = (Socket)ar.AsyncState; int bytesSent = handler.EndSend(ar); handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception ex) { thisf.Invoke(new DelegateWriteScanResult(thisf.WriteScanResult), new object[] { "", "反馈消息失败!" + ex.Message.ToString(), true }); } }
解决方案
50
看本人写的一篇关于粘包的处理
http://www.cnblogs.com/wangjun8868/p/4380187.html
正好实用你这个场景
50
这个错误是原因是服务器端报错了,服务器断开 了,导致客户端报的这个错,你最好在服务器端断点一下
用Console.Write() 输出strmsg (非DEBUG下)
string strmsg = Encoding.Default.GetString(state.bytedata, 0, bytesRead);
看收到的数据是不是粘包了,假如粘包了,数据要么少了要么多了很多