socket 第一次能接收到数据 第二次就接收不到了呢???

qq_15084153 2018-07-06 04:58:20
我现在有一个winform的服务端程序,调试助手,以及终端设备。
流程:调试助手是模拟web端下发指令。 web端下发指令给服务端,服务端和web端设定的协议进行解析,再根据和终端设备的协议 进行下发指令,终端接收后返回给服务端,再返回给web端

现在的问题是 第一次流程是没问题的,再下发指令,终端有反应,但是终端返回的数据服务端接收不到
...全文
807 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_15084153 2018-07-07
  • 打赏
  • 举报
回复
有木有大神帮忙解答一下呀
qq_15084153 2018-07-06
  • 打赏
  • 举报
回复
服务端和终端一直可以接收发送,加入web端进来 就第一次可以接收发送,第二次就收不到终端返回数据了。请教一下是什么原因呢
qq_15084153 2018-07-06
  • 打赏
  • 举报
回复
代码如下
private void GetTheadList()
{
try
{
//开启一个新线程不断接受用户的连接请求
ThreadPool.QueueUserWorkItem(new WaitCallback(skObj =>
{
skConnP = skObj as Socket;
//通过循环不断接受用户的连接请求
while (true)
{
//阻塞线程,等待用户的连接请求;每次只能连接一个,到处理到下面线程开启
//接收用户消息,那么重新等待;因为新开的线程不阻塞这里,本来线程不用等待
skCommu = skConnP.Accept();
//获取客户端信息
string userinfo = skCommu.RemoteEndPoint.ToString();
ShowMessage(DateTime.Now.ToString("HH:mm:ss fff") + "--[" + userinfo + "]连接成功");

lstUser.Invoke(new Action<string>(u =>
{
lstUser.Items.Add(u);
}), userinfo);
if (!_dict.ContainsKey(userinfo))
{
_dict.Add(userinfo, skCommu);
}

//再启动一个线程来循环接收用户发来的消息
ThreadPool.QueueUserWorkItem(new WaitCallback(skCommuObj =>
{
//启动该线程用来处理客户端不断发来的消息,用单独线程来执行
//while-true循环,防止阻塞主线程。主线程要继续执行调用Accept()的方法,来接收其他的客户端连接。
skCommuP = skCommuObj as Socket;
while (true)
{
byte[] buffers = new byte[1024 * 1024 * 2];
// //返回值表示实际接收到的字节数;这儿会阻塞线程,不会走,所以程序不会死;跟BlockingCollection<> 一样
skCommuP.ReceiveBufferSize = 8192;
int totalNumberOfBytes = 0;

int len = skCommuP.Receive(buffers, totalNumberOfBytes, skCommuP.ReceiveBufferSize, SocketFlags.None);

if (len==0||!skCommuP.Connected)
{
if (_dict.ContainsKey(userinfo))
{
_dict.Remove(userinfo);
}
if (skCommuP == Gloable.skWebComm)
Gloable.skWebComm = null;
if (Gloable._dictId.ContainsKey(skCommuP))
{
SendDataToWeb.SendData(skCommuP, Gloable.LoginOut, "退出登录");
Gloable._dictId.Remove(skCommuP);
}

//当客户端退出以后,在log文本框中显示用户退出的信息
ShowMessage(DateTime.Now.ToString("HH:mm:ss fff") + "--[" + skCommuP.RemoteEndPoint.ToString() + "]退出了。");

//从ListBox中删除当前用户
lstUser.Invoke(new Action<string>(x =>
{
lstUser.Items.Remove(x);
}), skCommuP.RemoteEndPoint.ToString());


break;
}
else
{
string userMessage = Concat.ToHexString2(buffers, len);

string str = DateTime.Now.ToString("HH:mm:ss fff") + "--[" + skCommuP.RemoteEndPoint.ToString() + "]接收:" + userMessage;
LogHelper.Instance.Info(str);
ShowMessage(str);

if (buffers[0] == 0x78 && buffers[1] == 0x78 && buffers[len - 2] == 0x0D && buffers[len - 1] == 0x0A)
{
PacketParser(buffers, len, skCommuP);
buffers = null;
}
else if (buffers[0] == 0x3D && buffers[1] == 0x3D)
{
InstructHandlerParser.WebToServerInstruct(buffers, len, skCommuP);
buffers = null;
}
}
}
}), skCommu);

}
}), listenSocket);

Thread replacementThread = new Thread(new ThreadStart(ReplacementToWeb));
replacementThread.Start();

}
catch (Exception ex)
{
LogHelper.Instance.Error(DateTime.Now.ToString("HH:mm:ss fff") + "--[程序出错]" + ex);
}
}

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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