socket异步通讯问题

FantasyFreed 2008-03-05 01:47:56
我用SOCKET异步写了一个客户端和一个服务端,我在客户端连续发出几条信息,可服务端只接收到了第一条信息,以后的信息都没有接收到,请问这是怎么回事?
...全文
109 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
FantasyFreed 2008-03-05
  • 打赏
  • 举报
回复
谢谢大家,lljfl的可以实现。
To:wzd24 牧野(高分亮解) 按照你的方法,当启动时,一直停留在client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);这。程序不能启动。可能是在一直在接受吧。忘说了,load()是在构造函数里,程序启动时,也就直接启动了。。。
tellyes 2008-03-05
  • 打赏
  • 举报
回复

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 2008-03-05
  • 打赏
  • 举报
回复
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;
}
}
wzd24 2008-03-05
  • 打赏
  • 举报
回复
server.BeginAccept(new AsyncCallback(AcceptConn), server);
这里改成:
client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
FantasyFreed 2008-03-05
  • 打赏
  • 举报
回复
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;
}
}
当客户端发送后,在红字部分打断点,只响应一次。以后都不响应了
wzd24 2008-03-05
  • 打赏
  • 举报
回复
把你的代码发出来看一下。估计你没有继续接收信息。
lljfl 2008-03-05
  • 打赏
  • 举报
回复
接收时应循环接收,你将你的代码贴出来看看
max8max 2008-03-05
  • 打赏
  • 举报
回复
一收到信息后就断开连接,再发时再连上,可不可以?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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