1.服务器端

服务器端所要做的事:
①创建服务器端套接字(Socket)
②绑定套接字(Bind)
③监听连接(Listen)
④异步接受连接(BeginAccept)
⑤结束异步接受连接,返回客户端的Socket(EndAccept)
⑥异步接收消息 (BeginReceive)
⑦结束异步接收消息 (EndReceive)

注意:
1.此处的EndReceive方法并不会立即停止接收,而是直到有数据进入,才会停止接收

2.在使用异步方法时,就相当于开启一个线程,当主线程结束时,其他线程也不会执行,所以主线程要用一个Console.ReadKey()来暂停主线程

3.在接收客户端消息的时候一定要判断消息的长度是否为0,因为当客户端关闭时,会不断地发送空的消息(我也不知道为什么)

4.递归的使用异步接收连接可以达到一个服务器端连接多个客户端的目的:

       /// <summary>/// 异步接收消息/// </summary>/// <param name="ar"></param>static void AcceptCallBack(IAsyncResult ar){Socket severSocket = (Socket)ar.AsyncState;Socket clientSocket = severSocket.EndAccept(ar);//向客户端发送一条消息string message = "Hello Client";clientSocket.Send(System.Text.Encoding.UTF8.GetBytes(message));//异步接收消息clientSocket.BeginReceive(messageRecieve, 0, 1024, SocketFlags.None, RecieveMessage, clientSocket);//异步连接其他客户端severSocket.BeginAccept(AcceptCallBack, severSocket);}

我的理解:相当于在A线程里面再开启了一个B线程,A线程发送"Hello Client"后异步接收消息后继续执行A线程,然后开启了B线程异步连接其他客户端。

整个服务器端代码

using System;
using System.Net.Sockets;
using System.Net;namespace SeverProject
{class Program{static byte[] messageRecieve = new byte[1024];static void Main(string[] args){//创建服务器端套接字Socket severSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//绑定套接字IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("192.168.137.1"), 13001);severSocket.Bind(iPEndPoint);//监听连接severSocket.Listen(0);//异步接受连接,返回客户端套接字severSocket.BeginAccept(AcceptCallBack, severSocket);//暂停主线程Console.ReadKey();}/// <summary>/// 异步接收消息/// </summary>/// <param name="ar"></param>static void AcceptCallBack(IAsyncResult ar){Socket severSocket = (Socket)ar.AsyncState;Socket clientSocket = severSocket.EndAccept(ar);//向客户端发送一条消息string message = "Hello Client";clientSocket.Send(System.Text.Encoding.UTF8.GetBytes(message));//异步接收消息clientSocket.BeginReceive(messageRecieve, 0, 1024, SocketFlags.None, RecieveMessage, clientSocket);//异步连接其他客户端severSocket.BeginAccept(AcceptCallBack, severSocket);}/// <summary>/// 异步接收消息/// </summary>/// <param name="ar"></param>static void RecieveMessage(IAsyncResult ar){Socket clientSocket = (Socket)ar.AsyncState;//防止有客户端关闭连接而使程序终止try{//输出接收到的消息int size = clientSocket.EndReceive(ar);string recieveStr = System.Text.Encoding.UTF8.GetString(messageRecieve, 0, size);if (recieveStr.Length == 0)return;Console.WriteLine(recieveStr);//异步接收消息clientSocket.BeginReceive(messageRecieve, 0, 1024, SocketFlags.None, RecieveMessage, clientSocket);}catch (Exception e){//关闭客户端Console.WriteLine(e);clientSocket.Close();}}}
}

2.客户端

客户端要做的事:
①创建客户端套接字
②连接服务器
③接收服务器消息
④发送消息

代码:

using System;
using System.Net.Sockets;
using System.Net;namespace clientProject
{class Program{static void Main(string[] args){//创建客户端套接字Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接服务器clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.137.1"), 13001));//接收服务器的一条消息byte[] messageRecieve = new byte[1024];int size = clientSocket.Receive(messageRecieve);string messageRecieveStr = System.Text.Encoding.UTF8.GetString(messageRecieve,0,size);Console.WriteLine(messageRecieveStr);//向客户端发送一条消息while(true){string sendMessage = Console.ReadLine();//以字母c关闭套接字if(sendMessage == "c"){clientSocket.Close();return;}clientSocket.Send(System.Text.Encoding.UTF8.GetBytes(sendMessage));}Console.ReadKey();clientSocket.Close();}}
}

Unity丛林战争学习01_TCP_异步接受连接和异步接收消息相关推荐

  1. Unity丛林战争学习02_TCP_解决分包和黏包的问题

    1.分包和黏包 分包:当发送的消息过长时会出现分包的情况,即一个消息分多次接收. 黏包:当发送的消息过短时会出现黏包的情况,即多个消息合在一起接收. 2.导致的问题 分包:UTF-8 使用一至四个字节 ...

  2. 微信收到消息很慢无法连接服务器,微信接收消息有延迟原因及解决办法

    微信收到消息总是延迟怎么回事呢?第一个就是网络延迟,第二个是手机信号不好,第三个就是微信自己设置的问题.下面,我们来看看微信收消息有延迟的原因及解决办法. 软件名称:微信安卓版 V8.0.9 for ...

  3. Siki_Unity_4-4_丛林战争_Socket/TCP网络游戏开发

    Unity 4-4 丛林战争(Socket/TCP网络游戏开发) 任务1:素材.演示.Prerequisite 使用c#的有关TCP的底层API进行服务器端的开发(直接通过socket进行通信) 功能 ...

  4. unity网络实战开发(丛林战争)-前期知识准备(006-修改服务器端开启异步处理客户端连接请求)

    使用工具:VS2015 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 继上一篇文章内容,这节课讲解一下修改服务器开启一步处理客户端连接请求. ...

  5. 网络游戏《丛林战争》开发与学习之(一):网络编程的基础知识

    <丛林战争>是一款完整的网络游戏案例,运用U3D开发客户端,Socket开发服务端,其中涉及到了网络编程.数据库和Unity的功能实现,之前通过U3D开发了一个单机游戏<黑暗之光&g ...

  6. unity网络实战开发(丛林战争)-正式开发阶段(014-游戏客户端与服务器端连接搭建)

    使用工具:VS2017,unity3d 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 上一篇文章中,我已经把服务器端的框架进行了搭建,接下来, ...

  7. unity网络实战开发(丛林战争)-正式开发阶段(016-数据库设计以及登录处理)

    使用工具:VS2017,unity3d 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 上一篇文章中,已经完成了游戏场景与开始界面UI的搭建,接 ...

  8. unity网络实战开发(丛林战争)-正式开发阶段(013-游戏服务器端框架搭建)

    使用工具:VS2015 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 继上一篇文章内容,这节课讲解一下游戏服务器端的开发. 01-项目目录结构 ...

  9. unity网络实战开发(丛林战争)-前期知识准备(010-在服务器端解析数据)

    使用工具:VS2015 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 继上一篇文章内容,这节课讲解一下在服务器端解析数据. 首先,同前文类同, ...

最新文章

  1. Python可迭代的对象与迭代器
  2. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
  3. 简单团队-爬取豆瓣电影TOP250-需求分析
  4. 关于ubuntu对有线网卡I219-V和无线网卡RTL8723DE 802.11b/g/n的支持问题
  5. 自动备份html文件,windows下定期自动备份本地文件(文件夹)
  6. vb microsoft.xmlhttp 获取所有超链接_编写我的第一个VB程序
  7. helperdialect mysql_Mybatis使用pageHelper步骤(动态分页)
  8. java动态变量名_Java||第一篇:了解Java并搭建环境
  9. 2.3.3 Zero Sum 和为零(DFS)
  10. klwp主题大全_klwp主题包百度网盘版下载-klwp主题包百度云版 _5577安卓网
  11. ONMF正交非负矩阵分解·论文总结
  12. matplotlib绘制鼠标的十字光标(自定义方式,官方实例)
  13. MySQL中的 last_day() 函数
  14. Netty总结(面试须知)
  15. java解压缩zip、rar
  16. Qt项目实战3:二维码生成器
  17. 【Scratch考级99图】图10-等级考试scratch 画正五边形
  18. 牛客网 |复数集合( 北邮往年复试题)
  19. oracle12c导入,Oracle 12c pdb使用expdp/impdp导入导出
  20. Stall Reservations POJ

热门文章

  1. java并发编程实战wwj----------------------第二阶段-------Future框架-------21-22-23
  2. Camstar开发常用数据库表及其关联
  3. 软件安全测试最新2020,JR T 0191-2020 证券期货业软件测试指南 软件安全测试.pdf
  4. 计算机毕业论文指导过程记录表6,毕业论文指导记录表6次
  5. 用计算机控制神舟十号,2010年全国自考操作系统概论模拟试卷(十)
  6. linux电脑每天定时重启命令,linux的定时重启的具体命令
  7. 《程序员》杂志社 2010SD软件开发2.0大会随笔
  8. 【软件测试大赛Web应用省赛】跳坑记录
  9. 按QQ查询QQ群数据库的方法
  10. 小米2018春招实习笔试题总结