Socket异步通讯,求指明什么意思

zdczdccccc 2014-05-17 04:17:07
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Asynchronous_TcpServer
{
class TcpServer_Async
{
static void Main(string[] args)
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"),2020);
serverSocket.Bind(serverIp);
serverSocket.Listen(100);
Console.WriteLine("服务器开始异步监听...");
AsyncAccept(serverSocket);
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
private static void AsyncAccept(Socket serverSocket)
{
try
{
serverSocket.BeginAccept(asyncResult =>//①①①①①①①①①①①①①①
{
Socket clientSocket = serverSocket.EndAccept(asyncResult);
//AsyncSend(clientSocket,"连接成功");
AsyncReceive(clientSocket);
AsyncAccept(serverSocket);
}, null);
}
catch (Exception ex)
{
Console.WriteLine("出现异常:" + ex.Message);
}

}

private static void AsyncSend(Socket clientSocket, string msg)
{
try
{
byte[] buffer = Encoding.Default.GetBytes("服务器说:" + msg);
clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, asyncResult =>
{
clientSocket.EndSend(asyncResult);
}, null);
}
catch (Exception ex)
{
Console.WriteLine("出现异常:" + ex.Message);
}

}
private static void AsyncReceive(Socket clientSocket)
{
try
{
byte[] buffer = new byte[1024];
clientSocket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None, asyncResult =>
{
clientSocket.EndReceive(asyncResult);
Console.WriteLine(Encoding.Default.GetString(buffer,0,buffer.Length));
AsyncReceive(clientSocket);
}, null);
}
catch (Exception ex)
{
Console.WriteLine("出现异常:" + ex.Message);
}

}
}
}


①处是个带参数的lambda,可是参数从哪传来的啊
...全文
284 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
maysoft 2014-05-20
  • 打赏
  • 举报
回复
帮顶!!!!!
zdczdccccc 2014-05-20
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
实际上,我不建议使用socket类。因为这是很低级的东西,是用来跟linux之类的系统相兼容的东西。 如果你是一个.net程序员,你应该习惯使用TcpListener、TcpClient等类型,而不是低级的Socket。 这高级的类,并不是直接调用低级的Socket类的,而是直接封装windows api中的IOCP机制的。因此使用TcpListner的人跟使用Socket类的人的系统不可同日而语,不是说越是使用低级的东西就好像越了解通讯。使用Socket类的人根本不太懂得用到IOCP,使用TcpListener的人才懂得去使用windows的IOCP机制!
sp解释下啊,starts是个站长好像也很牛的样子
starts_2000 2014-05-19
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
实际上,我不建议使用socket类。因为这是很低级的东西,是用来跟linux之类的系统相兼容的东西。 如果你是一个.net程序员,你应该习惯使用TcpListener、TcpClient等类型,而不是低级的Socket。 这高级的类,并不是直接调用低级的Socket类的,而是直接封装windows api中的IOCP机制的。因此使用TcpListner的人跟使用Socket类的人的系统不可同日而语,不是说越是使用低级的东西就好像越了解通讯。使用Socket类的人根本不太懂得用到IOCP,使用TcpListener的人才懂得去使用windows的IOCP机制!
TcpListener、TcpClient只是为了方便使用,对Socket进行了简单的封装,并不是封装IOCP什么的,可以直接Reflector代码出来看,要想实现IOCP和高性能的Socket,还是的自己使用Socket类和SAE进行开发。
zdczdccccc 2014-05-19
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
实际上,我不建议使用socket类。因为这是很低级的东西,是用来跟linux之类的系统相兼容的东西。 如果你是一个.net程序员,你应该习惯使用TcpListener、TcpClient等类型,而不是低级的Socket。 这高级的类,并不是直接调用低级的Socket类的,而是直接封装windows api中的IOCP机制的。因此使用TcpListner的人跟使用Socket类的人的系统不可同日而语,不是说越是使用低级的东西就好像越了解通讯。使用Socket类的人根本不太懂得用到IOCP,使用TcpListener的人才懂得去使用windows的IOCP机制!
十分感谢,我是学生,正在学.Net,看博客时看见了Socket编程,就想学习下,回头会看看TcpListener等相关的博客,谢谢
zdczdccccc 2014-05-19
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
这其实跟注册一个事件是一样的意思,都是注册委托方法给 serverSocket。然后当回调此(第一个参数表示的delegate)方法时,传递了一个参数,它的参数名字叫做 asyncResult。 实际上匿名委托,就是类似这样的委托
                serverSocket.BeginAccept(MyProc, null);
public void MyProc(asyncResult)
                {
                    Socket clientSocket = serverSocket.EndAccept(asyncResult);
                    AsyncReceive(clientSocket);
                    AsyncAccept(serverSocket);
                }
这不过是把这个形式精简了,叫做匿名委托。 因此首先你要懂得“委托”的概念,然后才能懂得当“宿主”回调委托方法时的参数传送。
是不是这个意思,BeginAccept方法产生了一个asyncResult,然后回调delegate时将那个asyncResult传给delegate; 还想请问为什么会有delegate,是不是向接口一样实现多态,提高重用,看网上很多说delegate类似于函数指针,可我觉得更像是对一个“类型”的函数的抽象
  • 打赏
  • 举报
回复
实际上,我不建议使用socket类。因为这是很低级的东西,是用来跟linux之类的系统相兼容的东西。 如果你是一个.net程序员,你应该习惯使用TcpListener、TcpClient等类型,而不是低级的Socket。 这高级的类,并不是直接调用低级的Socket类的,而是直接封装windows api中的IOCP机制的。因此使用TcpListner的人跟使用Socket类的人的系统不可同日而语,不是说越是使用低级的东西就好像越了解通讯。使用Socket类的人根本不太懂得用到IOCP,使用TcpListener的人才懂得去使用windows的IOCP机制!
  • 打赏
  • 举报
回复
这其实跟注册一个事件是一样的意思,都是注册委托方法给 serverSocket。然后当回调此(第一个参数表示的delegate)方法时,传递了一个参数,它的参数名字叫做 asyncResult。 实际上匿名委托,就是类似这样的委托
                serverSocket.BeginAccept(MyProc, null);
public void MyProc(asyncResult)
                {
                    Socket clientSocket = serverSocket.EndAccept(asyncResult);
                    AsyncReceive(clientSocket);
                    AsyncAccept(serverSocket);
                }
这不过是把这个形式精简了,叫做匿名委托。 因此首先你要懂得“委托”的概念,然后才能懂得当“宿主”回调委托方法时的参数传送。
zdczdccccc 2014-05-18
  • 打赏
  • 举报
回复
引用 2 楼 u013291805 的回复:
public IAsyncResult BeginAccept (AsyncCallback callback,Object state)
Lambda好像和匿名方法差不多。 asyncResult是个形参。
知道是个形参,可是值是从哪传来的啊
Pandorym 2014-05-17
  • 打赏
  • 举报
回复
public IAsyncResult BeginAccept (AsyncCallback callback,Object state)
Lambda好像和匿名方法差不多。 asyncResult是个形参。
zdczdccccc 2014-05-17
  • 打赏
  • 举报
回复
不要沉呀

110,535

社区成员

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

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

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