Пример #1
0
    //初始化
    void InitSocket()
    {
        currentjoin = new JoinPlayer();
        dpsend      = new DgramPlayer(transform);
        MyIP        = GetIPAddress();
        dpsend.IP   = MyIP;
        PlayerList  = new Dictionary <string, OtherPlayer>();

        //发送
        sock      = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //初始化一个Scoket实习,采用UDP传输
        clientEnd = new IPEndPoint(IPAddress.Broadcast, 9095);                                  //初始化一个发送广播和指定端口的网络端口实例
        sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);          //设置该scoket实例的发送形式



        //接受
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //初始化一个Scoket协议
        ipEnd  = new IPEndPoint(IPAddress.Any, 9095);                                        //初始化一个侦听局域网内部所有IP和指定端口
        ep     = (EndPoint)ipEnd;
        socket.Bind(ipEnd);                                                                  //绑定这个实例

        print("waiting for UDP dgram");

        //开启一个线程连接
        connectThread = new Thread(new ThreadStart(SocketReceive));
        connectThread.Start();
        InvokeRepeating("SocketSend", 0, 0.04f);
    }
Пример #2
0
 /// <summary>
 /// 接收
 /// </summary>
 void SocketReceive()
 {
     //进入接收循环
     while (true)
     {
         //对data清零
         recvData = new byte[1024];
         //获取客户端,获取客户端数据,用引用给客户端赋值
         recvLen = socket.ReceiveFrom(recvData, ref ep);
         //接收到一个包
         dpget = ((DgramPlayer)ConvertHelper.ByteToStructure(recvData));
         if (dpget.IP == MyIP)
         {
             continue;
         }
         else if (PlayerList.ContainsKey(dpget.IP))
         {
             //伤害数据包
             if (dpget.damage != 0 && MyIP == dpget.damageIP)
             {
                 MPlayerInfo.getins().damage(dpget.damage);
             }
             else
             {
                 //解析
                 OtherPlayer temp = PlayerList[dpget.IP];
                 GameObject  p    = temp.gobj;
                 temp.pos   = dpget.getpos();
                 temp.rot   = dpget.getrot();
                 temp.speed = dpget.speed;
                 //hp
                 temp.UpdateHp(dpget.HP);
                 //gun
                 temp.GunManage(dpget.getgunrot(), dpget.shooting);
             }
         }
         else
         {
             //加入
             //由于主线程才能使用unity的api,把添加用户的逻辑交给update;
             lock (currentjoin)
             {
                 currentjoin.join = true;
                 currentjoin.IP   = dpget.IP;
             }
         }
     }
 }