socket只能接受第一条数据
第一次收到数据后就再也收不到了,只能重启才能收。接受的代码如下
private static void ServerListen()
{
//获取服务器IP
string hostName = Dns.GetHostName();
IPAddress[] ip = Dns.GetHostAddresses(hostName);
IPAddress HostIp = ip[0];
lgServer.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss: IP地址:") + HostIp.ToString());
//创建一个网络端点
IPEndPoint iep = new IPEndPoint(IPAddress.Any, ListenPort);
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(iep);
serverSocket.Listen(60);
try
{
bool IsEnd = true; //接收数据结束标志
StateObject so = new StateObject();
int dataLengthPlan = 0; //应收数据长度(报文中定义的数据长度)
int dataLengthRecv = 0; //实收数据长度
while (SeverFlag)
{
FeedbackSocket = serverSocket.Accept();
while (SeverFlag)
{
byte[] b = new byte[StateObject.BufferSize];
int len = FeedbackSocket.Receive(b);
if (len > 0)
{
if (IsEnd) //新的请求
{
so = new StateObject(); //重新初始化数据对象
dataLengthPlan = (int)BitConverter.ToUInt32(b, 0); //获取应收数据长度
}
byte[] tmp = new byte[len]; //按实际收到的数据长度截取
Array.Copy(b, tmp, len);
so.allData.InsertRange(so.allData.Count, tmp); //当数据不能1次性全部接收时,需要拼包处理
dataLengthRecv += len;
if (dataLengthRecv >= dataLengthPlan) //一个请求的数据全部接收完毕,即实收长度>=应收长度
{
IsEnd = true;
dataLengthRecv = dataLengthPlan = 0;
DealwithTraffic(so);
}
else //数据没有全部接收结束,则继续接收
IsEnd = false;
}
}
}
}
catch (Exception ex)
{
lgServer.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": 接受消息进程错误" + ex.Message);
}
}