示例#1
0
    //接收线程
    void RecvMessage(object parameter)
    {
        SocketAccept client       = parameter as SocketAccept;
        Socket       clientsocket = client.socket;

        byte[] strbyte = new byte[2048];
        while (client.recv)
        {
            try
            {
                int count = clientsocket.Receive(strbyte);
                if (count > 0)
                {
                    byte[] result = new byte[count];
                    Array.Copy(strbyte, result, count);
                    if (client.recvQueue.Count < 2048)
                    {
                        client.recvQueue.Enqueue(result);
                    }
                    else
                    {
                        Debug.LogError("丢失数据包");
                    }
                }
            }
            catch (SocketException e)
            {
                OnClientException(client);
                Debug.LogError("client:" + client.id + "  " + e.Message);
            }
        }
    }
示例#2
0
 /// <summary>
 /// client加入
 /// </summary>
 private void WaitClientConnection()
 {
     while (waitClient)
     {
         Socket accept = tcpSocket.Accept();
         if (accept != null && GetClientCount() < maxClient)
         {
             int id = 0;
             if (freeID.Count > 0)
             {
                 id = freeID.Dequeue();
             }
             else
             {
                 id = clientIndex;
                 clientIndex++;
             }
             SocketAccept client = new SocketAccept(accept, id);
             clientList[id] = client;
             loginClient.Enqueue(id);
             client.id = id;
             //独立线程
             client.recvThread = new Thread(RecvMessage);
             client.recvThread.IsBackground = true;
             client.recvThread.Name         = id + "sendThr_Host";
             client.recvThread.Start(client);
             client.sendThread      = new Thread(SendMessage);
             client.sendThread.Name = id + "sendThr_Host";
             client.sendThread.Start(client);
             client.sendThread.IsBackground = true;
             curClient++;
         }
     }
 }
示例#3
0
 public void SendMsg(int index, byte[] data)
 {
     if (clientList != null && index < clientList.Length)
     {
         SocketAccept client = clientList[index];
         if (client != null)
         {
             client.sendQueue.Enqueue(data);
         }
     }
 }
示例#4
0
 public void SendMsg(byte[] data)
 {
     if (clientList != null)
     {
         for (int i = 0; i < clientList.Length; i++)
         {
             SocketAccept client = clientList[i];
             if (client != null)
             {
                 client.sendQueue.Enqueue(data);
             }
         }
     }
 }
示例#5
0
 /// <summary>
 /// 踢出Clietn
 /// </summary>
 public void RemoveClient(int id)
 {
     if (clientList != null)
     {
         for (int i = 0; i < clientList.Length; i++)
         {
             SocketAccept client = clientList[i];
             if (client != null && client.id == id)
             {
                 OnClientException(client);
             }
         }
     }
 }
示例#6
0
 //client异常
 void OnClientException(SocketAccept client)
 {
     if (isDispose == true)
     {
         return;
     }
     if (client != null && client.dispose == false)
     {
         int id = client.id;
         freeID.Enqueue(id);
         logoutClient.Enqueue(id);
         curClient--;
         Debug.Log("断开连接" + client.id);
         client.Dispose();
         clientList[id] = null;
     }
 }
示例#7
0
        private void OnAcceptComplete(int opaque, long sessionId, string ip, int port)
        {
            SocketAccept accept = new SocketAccept();

            accept.connection = sessionId;
            accept.ip         = ip;
            accept.port       = port;

            Message msg = new Message();

            msg.Source      = 0;
            msg.Destination = opaque;
            msg.Method      = "SocketAccept";
            msg.Data        = accept.encode();
            msg.RPCSession  = 0;
            msg.Type        = MessageType.Socket;

            ServiceContext service = ServiceSlots.GetInstance().Get(opaque);

            service.Push(msg);
        }
示例#8
0
    //client独立发送线程
    void SendMessage(object parameter)
    {
        SocketAccept client       = parameter as SocketAccept;
        Socket       clientsocket = client.socket;

        while (client.send)
        {
            try
            {
                if (client.sendQueue.Count > 0)
                {
                    clientsocket.Send(client.sendQueue.Dequeue());
                }
            }
            catch (SocketException e)
            {
                OnClientException(client);
                Debug.LogError(e.Message);
            }
            Thread.Sleep(10);
        }
    }
示例#9
0
 protected override void OnDispose()
 {
     isDispose  = true;
     waitClient = false;
     if (clientList != null)
     {
         for (int i = 0; i < clientList.Length; i++)
         {
             SocketAccept client = clientList[i];
             if (client != null)
             {
                 client.Dispose();
             }
         }
     }
     clientIndex = 0;
     curClient   = 0;
     clientList  = null;
     if (acceptThread != null)
     {
         acceptThread.Abort();
         acceptThread = null;
     }
 }