我确信这是最后的技术难关!
哪份资料说IOS的Session/Presentation/Application不好来着...

Session (TCP)

  • INetworkServer / INetorkUser
    1. Listen & Accept
    2. 给每个客户端分配一个Id使用服务器的端口号作为客户端Id
    3. 结束一个客户端,Socket.Close()
    4. 如果有Socket错误,全局通知该用户与服务器的连接中断(如果之前有其他错误则忽略,如何实现?)
    5. xxxAsync
    6. 多线程方面注意一下
  • INetworkClient
    1. Connect
    2. Id = RemoteEndPoint.Port
    3. 如果客户端主动退出,Socket.Close()
    4. 发送队列、接收队列,Send调用在UI线程,Receive事件同步到UI线程
      1. 如果是Send给自己的Pack,异步移到Receive事件,这儿可能死锁
    5. 如果收发包中出现Socket错误且客户端未主动退出,产生“连接到服务器中断”错误
Socket均设定了必须传完才能Close,所以如果出现Socket错误应该能直接判断连接到服务器中断。

Presentation

Presentation解析包失败,返回“服务器/主机传来了无法解析的数据”,TCP模式下,Lobby层关闭连接,Room层退出Room。
Server那儿,传送“无法解析的数据”数据包,INetworkUser.Remove()。
特别的情况,比如传来一个特别大的数据包头,然后死活不传完,那就只好等KeepAlive把它掐掉了,再大的数据包能传30秒绝对有问题。

Application

Login

登陆30秒倒计时,超时掐断。
  • LoginServer / LoginUser
    1. Accept之后的流程
    2. 满员,直接拜拜后掐(被ban也返回满员?)
      1. 不Listen由房间设定吧
    3. 等待客户端传送客户端程序版本信息
      • 成功
      • 版本不符合,返回合法版本域后Close
    4. 等待客户端传送登陆名和Avatar
      • 登陆名重复、登陆名不合法
      • 序列化失败,则在Presentation处就会掐断
  • LoginClient
    1. Connect之后的流程
    2. 传送客户端程序版本信息
    3. 收到成功消息,传送登陆名、Avatar
##

Lobby (Server/Client)

RawCommand由Header/Content组成,Header决定要做什么,Content解析
除了聊天需要优化以外,大部分功能序列化到Content

Last edited Feb 5, 2013 at 4:37 AM by Snowy, version 6

Comments

liuxinyu970226 Oct 13, 2013 at 1:38 PM 
局域网ok了,广域网怎么办