socket异步通讯问题 我用SOCKET异步写了一个客户端和一个服务端,我在客户端连续发出几条信息,可服务端只接收到了第一条信息,以后的信息都没有接收到,请问这是怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private void load() { server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 2020); server.Bind(iep); server.Listen(5); server.BeginAccept(new AsyncCallback(AcceptConn), server); } private void AcceptConn(IAsyncResult iar) { Socket oldServer = (Socket)iar.AsyncState; client = oldServer.EndAccept(iar); conStatus.Text = "连接到:" + client.RemoteEndPoint.ToString(); string stringData = "欢迎来到服务器"; byte[] message1 = Encoding.UTF8.GetBytes(stringData); client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client); } private void SendData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; int sent = client.EndSend(iar); try { client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); } catch (Exception ex) { Common.Log.Error(ex.ToString()); } } private void ReceiveData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; try { int recv = client.EndReceive(iar); if (recv == 18) { SPARE1 = BitConverter.ToInt16(data, 0); HEADERID = Encoding.UTF8.GetString(data, 2, 2); PLATEID = Encoding.UTF8.GetString(data, 4, 12); } } catch (Exception ex) { client.Close(); client.Shutdown(SocketShutdown.Both); conStatus.Text = "等待客户端..."; server.BeginAccept(new AsyncCallback(AcceptConn), server); return; } }当客户端发送后,在红字部分打断点,只响应一次。以后都不响应了 server.BeginAccept(new AsyncCallback(AcceptConn), server); 这里改成:client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); private void ReceiveData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; try { int recv = client.EndReceive(iar); if (recv == 18) { SPARE1 = BitConverter.ToInt16(data, 0); HEADERID = Encoding.UTF8.GetString(data, 2, 2); PLATEID = Encoding.UTF8.GetString(data, 4, 12); }//加上下面几句试试 if(client.Connected) { client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);}// } catch (Exception ex) { client.Close(); client.Shutdown(SocketShutdown.Both); conStatus.Text = "等待客户端..."; server.BeginAccept(new AsyncCallback(AcceptConn), server); return; } } private void AcceptConn(IAsyncResult iar) { Socket oldServer = (Socket)iar.AsyncState; client = oldServer.EndAccept(iar); conStatus.Text = "连接到:" + client.RemoteEndPoint.ToString(); string stringData = "欢迎来到服务器"; byte[] message1 = Encoding.UTF8.GetBytes(stringData); client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client); server.BeginAccept(new AsyncCallback(AcceptConn), server); //加上这句,否则你的服务器只能有一个客户端可以连接上 }另外楼上的方法可以解决你只能收到一条消息的问题 谢谢大家,lljfl的可以实现。To:wzd24 牧野(高分亮解) 按照你的方法,当启动时,一直停留在client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);这。程序不能启动。可能是在一直在接受吧。忘说了,load()是在构造函数里,程序启动时,也就直接启动了 关于 winodows mobile 引用 system.data问题 老是数据库连接出问题 一个从网页中swf文件读取链接的问题 关于 多个textBox的Text属性赋值问题? string转化成小数 [高手请进] 如何动态的向word文档中插入书签? C#服务中,定时弹出一个Windows窗口。怎么办?解决全分。 关于画圆弧的问题! 小弟远程重启计算机有问题,求救各位大虾 关于打开word文档的问题 ++i = 1 为什么不对? 图片随鼠标移动旋转!只旋转不移动!
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 2020);
server.Bind(iep);
server.Listen(5);
server.BeginAccept(new AsyncCallback(AcceptConn), server);
} private void AcceptConn(IAsyncResult iar)
{
Socket oldServer = (Socket)iar.AsyncState;
client = oldServer.EndAccept(iar);
conStatus.Text = "连接到:" + client.RemoteEndPoint.ToString();
string stringData = "欢迎来到服务器";
byte[] message1 = Encoding.UTF8.GetBytes(stringData);
client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);
} private void SendData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int sent = client.EndSend(iar);
try
{
client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
}
catch (Exception ex)
{
Common.Log.Error(ex.ToString());
}
} private void ReceiveData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
try
{
int recv = client.EndReceive(iar);
if (recv == 18)
{
SPARE1 = BitConverter.ToInt16(data, 0);
HEADERID = Encoding.UTF8.GetString(data, 2, 2);
PLATEID = Encoding.UTF8.GetString(data, 4, 12);
}
}
catch (Exception ex)
{
client.Close();
client.Shutdown(SocketShutdown.Both);
conStatus.Text = "等待客户端...";
server.BeginAccept(new AsyncCallback(AcceptConn), server);
return;
}
}
当客户端发送后,在红字部分打断点,只响应一次。以后都不响应了
这里改成:
client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
{
Socket client = (Socket)iar.AsyncState;
try
{
int recv = client.EndReceive(iar);
if (recv == 18)
{
SPARE1 = BitConverter.ToInt16(data, 0);
HEADERID = Encoding.UTF8.GetString(data, 2, 2);
PLATEID = Encoding.UTF8.GetString(data, 4, 12);
}
//加上下面几句试试
if(client.Connected)
{
client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
}
//
}
catch (Exception ex)
{
client.Close();
client.Shutdown(SocketShutdown.Both);
conStatus.Text = "等待客户端...";
server.BeginAccept(new AsyncCallback(AcceptConn), server);
return;
}
}
private void AcceptConn(IAsyncResult iar)
{
Socket oldServer = (Socket)iar.AsyncState;
client = oldServer.EndAccept(iar);
conStatus.Text = "连接到:" + client.RemoteEndPoint.ToString();
string stringData = "欢迎来到服务器";
byte[] message1 = Encoding.UTF8.GetBytes(stringData);
client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);
server.BeginAccept(new AsyncCallback(AcceptConn), server); //加上这句,否则你的服务器只能有一个客户端可以连接上
}另外楼上的方法可以解决你只能收到一条消息的问题
To:wzd24 牧野(高分亮解) 按照你的方法,当启动时,一直停留在client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);这。程序不能启动。可能是在一直在接受吧。忘说了,load()是在构造函数里,程序启动时,也就直接启动了