查看: 1566|回复: 3
打印 上一主题 下一主题

[其他] 游戏服务器开发 (服务器创建篇)

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53488
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2014-9-29 03:25:42 |只看该作者 |倒序浏览

虽然unity自身封装了NetWork组件并且在不断的完善它,但是个人并不喜欢这个东西。
众所周知服务器和客户端的开发工作是两个独立的个体,unity的这种做法却是将之混为一谈。
不过在需要高同步性的项目中,NetWork组件来做逻辑同步也是不错,具体如何选择看个人喜好和项目需求。
个人偏好于socket

采用此种方式 不必局限于unity 可以使用c c++ java 等各种语言来进行后台的开发
后台专注于数据、安全,前台专注于显示、品质,各司其职。

本系列文章采用c#+socket进行服务器开发
下面代码将创建一个简单的服务器监听
注:代码内注释清晰,所以本系列文章不会过多讲解
  1. class ServerStart
  2.     {

  3.         private static Socket server;//服务器监听对象
  4.         public static void start(int port)
  5.         {
  6.             //创建监听对象
  7.             server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  8.             //绑定监听端口
  9.             server.Bind(new IPEndPoint(IPAddress.Any, port));
  10.             server.Listen(20);
  11.             //开启异步连接监听
  12.             server.BeginAccept(AcceptCallBack, server);
  13.             Console.WriteLine("server start");
  14.             while (true) { }
  15.         }

  16.         public static void stop()
  17.         {
  18.             server.Dispose();
  19.             server.Close();
  20.         }

  21.         private static void AcceptCallBack(IAsyncResult ar)
  22.         {
  23.             Console.WriteLine("有客户端连接");
  24.             try
  25.             {
  26.                 Socket listener = (Socket)ar.AsyncState;
  27.                 //获取连接过来的连接信息
  28.                 Socket client = listener.EndAccept(ar);
  29.                 //创建自定义连接信息
  30.                 Session session = new Session();
  31.                 session.socket = client;
  32.                 //开始异步监听客户端消息
  33.                 client.BeginReceive(session.message, 0, session.message.Length, SocketFlags.None, ReceiveCallBack, session);
  34.                 //服务器继续监听下一个连接到来
  35.                 listener.BeginAccept(AcceptCallBack, listener);
  36.             }
  37.             catch
  38.             {
  39.             }
  40.         }

  41.         private static void ReceiveCallBack(IAsyncResult ar)
  42.         {
  43.             Session session = (Session)ar.AsyncState;
  44.             int readCount = 0;
  45.             try
  46.             {
  47.                 //读取消息长度
  48.                 readCount = session.socket.EndReceive(ar);//调用这个函数来结束本次接收并返回接收到的数据长度。
  49.                 if (readCount == 0)
  50.                 {
  51.                     Console.WriteLine("有客户端断开连接");
  52.                     LogicHandler.getInstance().sessionClose(session);
  53.                     return;
  54.                 }
  55.                 byte[] bytes = new byte[readCount];//创建长度对等的bytearray用于接收
  56.                 Buffer.BlockCopy(session.message, 0, bytes, 0, readCount);//拷贝读取的消息到 消息接收数组
  57.                 readMessage(session, bytes);//消息读取完成
  58.             }
  59.             catch (SocketException)//出现Socket异常就关闭连接
  60.             {
  61.                 session.socket.Close();//这个函数用来关闭客户端连接
  62.                 return;
  63.             }
  64.             //继续监听下一条消息的到来
  65.             session.socket.BeginReceive(session.message, 0, session.message.Length, SocketFlags.None, ReceiveCallBack, session);

  66.         }
  67. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

33

主题

1

听众

2680

积分

中级设计师

Rank: 5Rank: 5

纳金币
559
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-9-29 08:55:55 |只看该作者
支持好资源
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-9-29 09:30:02 |只看该作者
Thanks for sharing this one !
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-10-2 05:27:17 |只看该作者
Thanks  for sharing this !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-14 12:44 , Processed in 0.094807 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部