- 最后登录
- 2021-7-6
- 注册时间
- 2012-12-27
- 阅读权限
- 90
- 积分
- 76145
- 纳金币
- 53488
- 精华
- 316
|
虽然unity自身封装了NetWork组件并且在不断的完善它,但是个人并不喜欢这个东西。
众所周知服务器和客户端的开发工作是两个独立的个体,unity的这种做法却是将之混为一谈。
不过在需要高同步性的项目中,NetWork组件来做逻辑同步也是不错,具体如何选择看个人喜好和项目需求。
个人偏好于socket
采用此种方式 不必局限于unity 可以使用c c++ java 等各种语言来进行后台的开发
后台专注于数据、安全,前台专注于显示、品质,各司其职。
本系列文章采用c#+socket进行服务器开发
下面代码将创建一个简单的服务器监听
注:代码内注释清晰,所以本系列文章不会过多讲解- class ServerStart
- {
- private static Socket server;//服务器监听对象
- public static void start(int port)
- {
- //创建监听对象
- server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- //绑定监听端口
- server.Bind(new IPEndPoint(IPAddress.Any, port));
- server.Listen(20);
- //开启异步连接监听
- server.BeginAccept(AcceptCallBack, server);
- Console.WriteLine("server start");
- while (true) { }
- }
- public static void stop()
- {
- server.Dispose();
- server.Close();
- }
- private static void AcceptCallBack(IAsyncResult ar)
- {
- Console.WriteLine("有客户端连接");
- try
- {
- Socket listener = (Socket)ar.AsyncState;
- //获取连接过来的连接信息
- Socket client = listener.EndAccept(ar);
- //创建自定义连接信息
- Session session = new Session();
- session.socket = client;
- //开始异步监听客户端消息
- client.BeginReceive(session.message, 0, session.message.Length, SocketFlags.None, ReceiveCallBack, session);
- //服务器继续监听下一个连接到来
- listener.BeginAccept(AcceptCallBack, listener);
- }
- catch
- {
- }
- }
- private static void ReceiveCallBack(IAsyncResult ar)
- {
- Session session = (Session)ar.AsyncState;
- int readCount = 0;
- try
- {
- //读取消息长度
- readCount = session.socket.EndReceive(ar);//调用这个函数来结束本次接收并返回接收到的数据长度。
- if (readCount == 0)
- {
- Console.WriteLine("有客户端断开连接");
- LogicHandler.getInstance().sessionClose(session);
- return;
- }
- byte[] bytes = new byte[readCount];//创建长度对等的bytearray用于接收
- Buffer.BlockCopy(session.message, 0, bytes, 0, readCount);//拷贝读取的消息到 消息接收数组
- readMessage(session, bytes);//消息读取完成
- }
- catch (SocketException)//出现Socket异常就关闭连接
- {
- session.socket.Close();//这个函数用来关闭客户端连接
- return;
- }
- //继续监听下一条消息的到来
- session.socket.BeginReceive(session.message, 0, session.message.Length, SocketFlags.None, ReceiveCallBack, session);
- }
- }
复制代码 |
|