//接收线程 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); } } }
/// <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++; } } }
public void SendMsg(int index, byte[] data) { if (clientList != null && index < clientList.Length) { SocketAccept client = clientList[index]; if (client != null) { client.sendQueue.Enqueue(data); } } }
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); } } } }
/// <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); } } } }
//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; } }
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); }
//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); } }
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; } }