如题:
socket编程,想将服务器放在外网,内网用户可以与服务器通讯吗?
socket用的是IP地址和端口,而内网用户经路由转发后的IP地址都是相同的,如何区分这些来自不同机器的IP?
像腾讯QQ这种即时通讯是通过什么方式来解决?socketqq即时通讯

解决方案 »

  1.   

    内网用户每一次开始与外网服务器“握手”,其在网上的端口号基本上都是变化的。即时通讯与其它通讯一样,通过自定义的信令协议来完成。例如客户端发送这样的消息{
        "type": "Register",
        "sn": 6,
        "app": "微信电冰箱客户端",
        "data":
          {
              "userId": "45987363",
              "pwd_hash": "7374823883342ab="
          }
    }(当然这只是举例)通过json对象的的type属性告诉服务器这是Register命令,服务器就会用相应的类型把data反序列化为.net程序的、你自定义的Register类型对象实例(假设服务器是.net开发的),然后执行这个对象的Execute方法(假设所有命令都实现了ICommand接口),最后将这个方法的返回的object值再序列化为json字符串返回给客户端。而客户端当然知道返回的字符串的反序列化类型。
      

  2.   

    实际上客户端除了“注册、登录”等少数命令以外,基本上成百上千个其它命令都会有一个passportId(或者叫做sessionId)的属性,这是“会话编号”,是登录时由服务器返回给客户端的。比如说客户端发给服务器这样的命令{
        "type": "发送聊天消息",
        "sn": 11298,
        "pid": "ix99237623",
        "to": "ix92833741",
        "data":
        {
            "html": "<img src=\"pic101.png\" alt=\"吐舌\" />不可以<strong>!</ strong>",
            "楼层编号": 120,
            "style class": "x330"
        }
    }
        通过会话编号,来标识客户端的应用程序进程。而不是什么IP。
      

  3.   

    基本上成百上千个其它命令都会有一个passportId -->  基本上成百上千个其它命令在发送时都会伴随着passportId
      

  4.   

    IP相同,但是端口不同。难道你不知道NAT么?支持NAT的路由器会负责内网地址的转换和翻译。
      

  5.   

    其实我不明白的是,在socket编程中用的是IP与port,在外网服务器,内网客户端的情况下,IP地址该填写什么?
    比如Server端IP:212.85.157.9
    Client端内网IP:192.168.253.2,WAN口IP:212.88.15.6
    Client连接Server时,直接使用UpdClient.Send( , , ) 这里用212.85.157.9与Server连接?
    Server接收到的数据显示来源是212.88.15.6还是192.168.253.2?
    这时候直接获得的IP回复会返回到Client端?
      

  6.   

    自己顶一下
    关于socket编程看来还有很多要学习的