//初始化 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); }
/// <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; } } } }