c# socket 有没有人遇到socket多个客户端编程,2个以上客户端上线后,先前上线的会很难(有时会接到)接到服务器发送过去的数据,新上线的客户接收数据就反映很快。用的异步,和同步多线程都有这种问题,有谁知道怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 补充一下,在PC机上就可以,如果放到一个wince上运行,就会出这种问题。部分代码,这些代码到底有什么问题,用同步多线程,问题一样,用java写的问题也一样。Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);listener.Bind(new IPEndPoint(_ip, _port));listener.Listen(100);listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);public void OnConnectRequest(IAsyncResult ar){ Socket listener = (Socket)ar.AsyncState; NewConnection(listener.EndAccept(ar)); listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);}public void NewConnection(Socket sockClient){ byte[] packetBuff = new byte[_max];// _max,1024 sockClient.Receive(packetBuff); string _s = pEncoding.Encoding.GetString(packetBuff).TrimEnd('\0'); string userKey, userSay;//userKey唯一标记,userSay客户端名称,都是客户端连接成功后马上发送过来的,格式userKey|userSay try { userKey = _s.Split('|')[0]; userSay = _s.Split('|')[1]; } catch (Exception ex) { userKey = "..."; userSay = "..."; } clientsSession session = new clientsSession();//一个保存客户端的对象 sockClient.Blocking = false; session.SessionSocket = sockClient; session.Key = userKey;//唯一标记 //一些判断代码(没有贴上来) par.clients.Add(userKey,session);//par.clients是一个hashtable SetupRecieveCallback(session);}ublic void SetupRecieveCallback(clientsSession session) { try { AsyncCallback recieveData = new AsyncCallback(ReceiveData); session.SessionSocket.BeginReceive(session.m_byBuff, 0, session.m_byBuff.Length, SocketFlags.None, recieveData, session); } catch (Exception ex) { par.log.Add(ex.Message, cmd.protocol.LogIcon.All); } } //ReceiveData函数实现,省略。 //发送也是异步public void SendCmd(string key, string send) { try { clientsSession session = par.pp[key] as session; byte[] _b = pEncoding.Encoding.GetBytes(send); AsyncCallback sendRev = new AsyncCallback(SendRev);//SendRev为发送 session.SessionSocket.BeginSend(_b, 0, _b.Length, SocketFlags.None, sendRev, session); } catch { //..... } } //发送 private void SendRev(IAsyncResult ar) { clientsSession session = (clientsSession)ar.AsyncState; Socket sock = session .SessionSocket; int nBytesRec = sock.EndSend(ar); if (nBytesRec < 1) { sock.Shutdown(SocketShutdown.Both); sock.Close(); } } 看看这个!一个我经常参考的异步socket通信:C#.net 同步异步SOCKET通讯和多线程总结 socket通信额,有没有能够讲解一下子啊! 你是说客户端换成wince就收不到数据吗?是不是端口没设置好,抓包看看 如果只有一个wince,就正常,多个wince,特别是先前上线的wince,socket程序就很难收到服务器发送的数据。。新上线的就很好。兄弟有没有什么抓包工具可以推荐下? 如何使其中一个改变大小和位置时,另一个控件与之的距离不变 你在代码中,用中文命名变量和方法吗? c# 无法完整删除 XML 带ID的节点 求一正则。。 寻找C#中快速填充ListView的方案,万条记录 请问我最近下载的SharpDevelop C#编辑器为什么没有界面设计部分(窗口,控件的拖放界面)? C#写EXCEL遇到的问题 在线求解:如何在DataGrid中捕获回车键事件添加自己的处理函数--高手请进 对于大家来说,这真的是一个简单问题。 创建的ASP.NET WEB服务,为什么没法调试? 几道面试题! 如何将报销单数据生成用友财务凭证导入到用友系统中
部分代码,这些代码到底有什么问题,用同步多线程,问题一样,用java写的问题也一样。Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(_ip, _port));
listener.Listen(100);
listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);public void OnConnectRequest(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
NewConnection(listener.EndAccept(ar));
listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
}public void NewConnection(Socket sockClient)
{ byte[] packetBuff = new byte[_max];// _max,1024
sockClient.Receive(packetBuff);
string _s = pEncoding.Encoding.GetString(packetBuff).TrimEnd('\0');
string userKey, userSay;//userKey唯一标记,userSay客户端名称,都是客户端连接成功后马上发送过来的,格式userKey|userSay try
{
userKey = _s.Split('|')[0]; userSay = _s.Split('|')[1];
}
catch (Exception ex)
{
userKey = "...";
userSay = "...";
}
clientsSession session = new clientsSession();//一个保存客户端的对象
sockClient.Blocking = false; session.SessionSocket = sockClient; session.Key = userKey;//唯一标记 //一些判断代码(没有贴上来)
par.clients.Add(userKey,session);//par.clients是一个hashtable SetupRecieveCallback(session);
}ublic void SetupRecieveCallback(clientsSession session)
{
try
{
AsyncCallback recieveData = new AsyncCallback(ReceiveData);
session.SessionSocket.BeginReceive(session.m_byBuff, 0, session.m_byBuff.Length, SocketFlags.None, recieveData, session);
}
catch (Exception ex)
{
par.log.Add(ex.Message, cmd.protocol.LogIcon.All);
}
}
//ReceiveData函数实现,省略。 //发送也是异步
public void SendCmd(string key, string send)
{
try
{
clientsSession session = par.pp[key] as session;
byte[] _b = pEncoding.Encoding.GetBytes(send);
AsyncCallback sendRev = new AsyncCallback(SendRev);//SendRev为发送
session.SessionSocket.BeginSend(_b, 0, _b.Length, SocketFlags.None, sendRev, session);
}
catch
{
//.....
}
} //发送
private void SendRev(IAsyncResult ar)
{
clientsSession session = (clientsSession)ar.AsyncState;
Socket sock = session .SessionSocket;
int nBytesRec = sock.EndSend(ar);
if (nBytesRec < 1)
{
sock.Shutdown(SocketShutdown.Both);
sock.Close();
}
}
一个我经常参考的异步socket通信:
C#.net 同步异步SOCKET通讯和多线程总结
如果只有一个wince,就正常,多个wince,特别是先前上线的wince,socket程序就很难收到服务器发送的数据。。新上线的就很好。兄弟有没有什么抓包工具可以推荐下?