socket异步监听到链接就给该客户端发送消息 求指教

wysxm2001 2011-08-02 12:46:36
实现内容:在一个服务器启动监听 N个客户端会自动连接该服务器只是连接并不发送消息 服务器需要做的是客户端连 接后给客户端发送消息

private void Listen()
{
IPAddress ipAddress = IPAddress.Parse("192.168.1.2");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5500);

//Create a TCP/IP socket
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

try
{
listener.Bind(localEndPoint);
listener.Listen(100);

while (true)
{
//Set the event to nonsingaled state
allDone.Reset();

//Start Waiting
listener.BeginAccept(
new AsyncCallback(AcceptConn1),
listener);

//WaitUntil
allDone.WaitOne();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}

public void AcceptConn1(IAsyncResult iar)
{
//Signal the main thread to conntinue
allDone.Set();

Socket s = (Socket)iar.AsyncState;
try
{
Socket handler = s.EndAccept(iar);
StateObject state = new StateObject();
state.worksocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallBack), state);
}
catch (Exception ex)
{
}
}

上面是代码 客户端连接同时发送给客户端消息应该写在哪里 求指教
...全文
98 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
发送什么??

另外,写BeginAccept是十足的画蛇添足的,你的这个代码是假的唬人的异步代码。写同步Accept还能轻快一点。
dai78 2011-08-02
  • 打赏
  • 举报
回复
没接收到一个连接事件,就给这个连接发送数据
wysxm2001 2011-08-02
  • 打赏
  • 举报
回复
十分感谢 我去试验一下 1定会结贴的
jxyvc 2011-08-02
  • 打赏
  • 举报
回复
aceept到一个连接后,生成一个客户端socket,向这个socket发数据就可以了
窗户纸 2011-08-02
  • 打赏
  • 举报
回复
对不起,是 ReadCallBack中取收到的数据
窗户纸 2011-08-02
  • 打赏
  • 举报
回复
做异步通信可以建立一个接收队列,并对队列设置一个HasRecvObj的事件,有信息时,BeginAccept会使用新的线程激发AcceptConn1(IAsyncResult iar)的callback, 在AcceptConn1(IAsyncResult iar)
中,可以将收到的数据入队,并使用HasRecvObj.BeginInvoke()方法发出异步通知,通知数据处理程序(注册该事件的程序)进行处理。
  • 打赏
  • 举报
回复
sorry,上面打字太随意了,呵呵写错了一个词,特此更正:

另外有人说在异步Accept的回调中去执行BeginAccept是递归调用。这是不对的。简单套用语法看似递归调用,但是这是异步操作,根本不是递归调用,也没有那种递归调用的占用堆栈的问题。
  • 打赏
  • 举报
回复
另外你的代码,异步进行Accept是画蛇添字的。就算是同步阻塞Accept,反正你是异步Receive,所以同步和异步Accept是一样的,都是(按照你的写法)阻塞那么长时间。

真正的异步Accept,不需要放在一个while循环中,也不需要用信号量阻塞。主程序只要写BeginAccept这就结束了,没有更多的代码需要执行了。然后在异步Accept的回调中你才需要另外再执行一个BeginAccept。

另外有人说在异步Accept的回调中去执行BeginAccept是回调。这是不对的。简单套用语法看似回调,但是这是异步操作,根本不是回调,也没有那种回调的占用堆栈的问题。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wysxm2001 的回复:]
就是那个客户端请求连接就发给他
[/Quote]

那么在你的 Socket handler = s.EndAccept(iar) 代码之后,直接向handler执行send操作就行了。
isjoe 2011-08-02
  • 打赏
  • 举报
回复
另外:你这代码哪里抄的。。。。。。BeginAccept()根本不需要和while组合使用的。。。
isjoe 2011-08-02
  • 打赏
  • 举报
回复

//当此方法执行的时候,说有个客户连接进来了,你可以用Socket s回复它。
public void AcceptConn1(IAsyncResult iar)
{
//Signal the main thread to conntinue
allDone.Set();

Socket s = (Socket)iar.AsyncState;
try
{
Socket handler = s.EndAccept(iar);
StateObject state = new StateObject();
state.worksocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallBack), state);
}
catch (Exception ex)
{
}
}



另外:你这代码哪里抄的。。。。。。BeginAccept()根本需要和while组合使用的。。。

while (true)
{
//Start Waiting
listener.BeginAccept(
new AsyncCallback(AcceptConn1),
listener);
}
showjim 2011-08-02
  • 打赏
  • 举报
回复
你把Accept到的Socket保存到一个集合里面,需要发消息的时候foreach一次不行吗?
wysxm2001 2011-08-02
  • 打赏
  • 举报
回复
就是发送给客户端一个字符串就可以 那个客户端请求连接就发给他
  • 打赏
  • 举报
回复
个客户端发送什么消息?怎么知道给谁发?你至少应该有点业务逻辑说明。

110,535

社区成员

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

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

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