1、方法介绍

BeginAccept(AsyncCallback callback, object state);

异步开始监听客户端连接。

  1. callback为一个委托,在成功接收客户端连接时调用委托方法。
  2. 向委托方法中传递的参数

**EndAccept (IAsyncResult result);**
结束监听客户端连接,一般在委托中成功接收连接后使用。
1. **result**:它存储此异步操作的状态信息以及任何用户定义数据。
返回。使用**result.AsyncState** 可以接收传递过来的参数。


**BeginReceive (byte[] buffer, int offset, int size, SocketFlags flag, AsyncCallback callback, object state);**
异步接收服务器发送来的数据
1. 存储接收的数据
2. 从buffer哪开始存储数据
3. 要接受最大的字节数
4. SocketFlags 值的按位组合
5. 接收成功后调用的委托方法
6. 要传递的参数

2、服务器端

namespace Tcp服务器端
{
class Program
{
/// <summary>
/// 接收客户端发送数据数组
/// </summary>
static byte[] data = new byte[1024]; static void Main(string[] args)
{
StartServerAsync();
} static void StartServerAsync()
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint point = new IPEndPoint(IPAddress.Parse("192.168.1.3"), 5555);
serverSocket.Bind(point);
serverSocket.Listen(100); //异步监听客户端连接
serverSocket.BeginAccept(AcceptCallBack,serverSocket); Console.ReadKey();
}
/// <summary>
/// 接收到客户端连接时调用
/// </summary>
static void AcceptCallBack(IAsyncResult ar)
{
Console.WriteLine("一个客户端连接了进来\n");
Socket serverSocket = null;
try
{
//接收传递过来的main中的serverSocket
serverSocket = ar.AsyncState as Socket;
//结束接收,返回接收到的clientSocket
Socket clientSocket = serverSocket.EndAccept(ar); clientSocket.Send(Encoding.UTF8.GetBytes("你好呀。。。客户端"));
//异步开始监听客户端传递数据
clientSocket.BeginReceive(data, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket); //从头开始存,最大数量,none,接收到客户端后执行的回调函数,要传递的参数(会被传递给回调函数) //继续处理下一个客户端的连接,相当于一个伪递归
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}
catch (Exception e)
{
Console.WriteLine(e);
if (serverSocket != null)
serverSocket.Close();
}
}
/// <summary>
/// 接收到客户端发送的数据时调用
/// </summary>
static void ReceiveCallBack(IAsyncResult ar)
{
Socket clientSocket = null;
try
{
clientSocket = ar.AsyncState as Socket;
int count = clientSocket.EndReceive(ar); //正常关闭的情况
if (count == 0)
{
Console.WriteLine("一个客户端正常断开了连接");
clientSocket.Close();
return;
}
Console.WriteLine("接收到数据:" + Encoding.UTF8.GetString(data, 0, count)); clientSocket.BeginReceive(data, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket); //从头开始存,最大数量,none,接收到客户端后执行的回调函数,要传递的参数
}
catch (Exception e)
{
//非正常关闭的情况
Console.WriteLine(e);
if (clientSocket != null)
clientSocket.Close();
}
} }
}

3、客户端

namespace Tcp客户端
{
class Program
{
static void Main(string[] args)
{
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
EndPoint point = new IPEndPoint(IPAddress.Parse("192.168.1.3"), 5555);
clientSocket.Connect(point); byte[] data = new byte[1024];
int length = clientSocket.Receive(data);
Console.WriteLine(Encoding.UTF8.GetString(data, 0, length)); //循环向服务器发送数据
while (true)
{
string s = Console.ReadLine();
//输入c正常退出,直接按×异常退出
if (s == "c")
{
clientSocket.Close();
return;
}
clientSocket.Send(Encoding.UTF8.GetBytes(s));
} Console.ReadKey(); }
}
}

4、效果

服务器可以接收多个客户端连接

多个客户端都可以向服务器发送数据

最新文章

  1. AWS 免费套餐
  2. 将nuget与VS直接集成,实现一键上传等功能
  3. 换行(\r)和回车(\n)
  4. java基础1_Java数据类型
  5. asp.net的简易的参数化查询
  6. 提高 DHTML 页面性能
  7. 三星S4,呼转的来电,在来电界面上不显示的解决方案
  8. dictEntry **table;
  9. java_stack
  10. [wikioi]四色问题
  11. 基于visual Studio2013解决C语言竞赛题之0413同构数
  12. Problem F: 多少个最大值?
  13. Linux中变量#,@,0,1,2,*,$$,$?的意思
  14. sqlserver中select造成死锁
  15. Linux显示历史记录
  16. vue iview UPload,但文件上传是,clearFiles的使用方法
  17. zabbix环境搭建
  18. [UE4]迁移小地图到其他工程
  19. 在page cache中的页,如果当时没有进程read或者write,引用计数到底该为多少
  20. Java java.lang.Thread#join()方法分析

热门文章

  1. docker 安装过程
  2. CCSpriteBatchNode CCSpriteFrameCache
  3. bzoj 3302&amp;2447&amp;2103 树的双中心 树形DP
  4. 让网站变灰的CSS代码(支持IE、FIREFOX和CHROME)(转)
  5. 检测 iOS 的 APP 性能的一些方法
  6. oracle rac的特征
  7. [转]升级Flash Builder 4.6中的Flash Player版本
  8. Linux负载均衡软件之LVS
  9. js数组中常用的几个API
  10. 面向对象要点(this关键字)