/// <summary> /// Disconnect callback /// </summary> /// <param name="socket">client socket</param> public void OnParallelSocketDisconnect(IParallelSocket socket) { DetachPair(); }
/// <summary> /// NewConnection callback /// </summary> /// <param name="socket">client socket</param> public void OnParallelSocketNewConnection(IParallelSocket socket) { Debug.Print("socket connected"); }
/// <summary> /// Receive callback /// </summary> /// <param name="socket">client socket</param> /// <param name="receivedPacket">received packet</param> public void OnParallelSocketReceived(IParallelSocket socket, ParallelPacket receivedPacket) { lock (m_generalLock) { if (socket == m_socket1) { m_socket2.Send(receivedPacket.PacketRaw, receivedPacket.HeaderSize, receivedPacket.DataByteSize); } else { m_socket1.Send(receivedPacket.PacketRaw, receivedPacket.HeaderSize, receivedPacket.DataByteSize); } } }
/// <summary> /// Send callback /// </summary> /// <param name="socket">client socket</param> /// <param name="status">stend status</param> /// <param name="sentPacket">sent packet</param> public void OnParallelSocketSent(IParallelSocket socket, SendStatus status, ParallelPacket sentPacket) { }
/// <summary> /// Detach the given client from the server management /// </summary> /// <param name="socket">the client to detach</param> /// <returns>the number of socket in the room</returns> public int DetachClient(IParallelSocket socket) { lock (m_listLock) { m_socketList.Remove(socket); Task t = new Task(delegate() { OnParallelRoomLeave(this, socket); }); t.Start(); return m_socketList.Count; } }
/// <summary> /// NewConnection callback /// </summary> /// <param name="socket">client socket</param> public void OnParallelSocketNewConnection(IParallelSocket socket) { // Will never get called }
/// <summary> /// Receive callback /// </summary> /// <param name="socket">client socket</param> /// <param name="receivedPacket">received packet</param> public void OnReceived(IParallelSocket socket, ParallelPacket receivedPacket) { string recvString=ASCIIEncoding.ASCII.GetString(receivedPacket.GetData().ToArray()); Debug.Print("[" + receivedPacket.GetPacketID() + "] " + recvString); socket.Send(receivedPacket.GetData().ToArray()); }
/// <summary> /// Disconnect callback /// </summary> /// <param name="socket">client socket</param> public void OnParallelSocketDisconnect(IParallelSocket socket) { Debug.Print("socket disconnected"); }
/// <summary> /// Join the room /// </summary> /// <param name="socket">socket</param> /// <param name="roomName">room name</param> /// <returns>the instance of the room</returns> public ParallelRoom Join(IParallelSocket socket, string roomName) { lock (m_roomLock) { ParallelRoom curRoom = null; if (m_roomMap.ContainsKey(roomName)) { curRoom = m_roomMap[roomName]; } else { curRoom = new ParallelRoom(roomName,RoomCallBackObj); m_roomMap[roomName] = curRoom; } curRoom.AddSocket(socket); return curRoom; } }
/// <summary> /// Detach given socket from the given room /// </summary> /// <param name="socket">socket to detach</param> /// <param name="roomName">room name</param> /// <returns>number of sockets left in the room</returns> public int Leave(IParallelSocket socket, string roomName) { lock (m_roomLock) { if (m_roomMap.ContainsKey(roomName)) { int numSocketLeft = m_roomMap[roomName].DetachClient(socket); if (numSocketLeft == 0) { m_roomMap.Remove(roomName); } return numSocketLeft; } return 0; } }
/// <summary> /// Broadcast given data to the server /// </summary> /// <param name="data">data in byte array</param> public void Broadcast(IParallelSocket sender, byte[] data) { List<ParallelSocket> socketList = GetClientSocketList(); foreach (ParallelSocket socket in socketList) { if (socket != sender) socket.Send(data); } }
/// <summary> /// Broadcast the given packet to all the client, connected /// </summary> /// <param name="sender">sender of the broadcast</param> /// <param name="data">data in byte array</param> public void Broadcast(IParallelSocket sender, byte[] data) { Broadcast(sender, data, 0, data.Count()); }
/// <summary> /// Broadcast the given packet to all the client, connected /// </summary> /// <param name="sender">sender of the broadcast</param> /// <param name="data">data in byte array</param> /// <param name="offset">offset in bytes</param> /// <param name="dataSize">data size in bytes</param> public void Broadcast(IParallelSocket sender, byte[] data, int offset, int dataSize) { List<IParallelSocket> list = GetSocketList(); foreach (IParallelSocket socket in list) { if(socket!=sender) socket.Send(data, offset, dataSize); } Task t = new Task(delegate() { OnParallelRoomBroadcast(this,sender, data, offset, dataSize); }); t.Start(); }
/// <summary> /// Receive callback /// </summary> /// <param name="socket">client socket</param> /// <param name="receivedPacket">received packet</param> public void OnParallelSocketReceived(IParallelSocket socket, ParallelPacket receivedPacket) { byte[] receivedData = receivedPacket.CloneData(); string recvString = ASCIIEncoding.ASCII.GetString(receivedData); Debug.Print("Received [" + receivedPacket.PacketID + "] " + recvString); socket.Send(receivedData); }
/// <summary> /// Connect given two socket as p2p /// </summary> /// <param name="socket1">first socket</param> /// <param name="socket2">second socket</param> /// <param name="callback">callback object</param> /// <returns>true if paired otherwise false</returns> public bool ConnectPair(IParallelSocket socket1, IParallelSocket socket2, IParallelP2PCallback callBackObj) { if (!Paired) { if (socket1 != null && socket2 != null && socket1!=socket2 && socket1.IsConnectionAlive && socket2.IsConnectionAlive) { lock (m_generalLock) { m_socket1 = socket1; m_socket2 = socket2; m_socket1.CallBackObj = this; m_socket2.CallBackObj = this; Paired = true; CallBackObj = callBackObj; return true; } } } return false; }
/// <summary> /// Send callback /// </summary> /// <param name="socket">client socket</param> /// <param name="status">stend status</param> /// <param name="sentPacket">sent packet</param> public void OnParallelSocketSent(IParallelSocket socket, SendStatus status, ParallelPacket sentPacket) { string sentString = ASCIIEncoding.ASCII.GetString(sentPacket.CloneData()); Debug.Print("Sent [" + sentPacket.PacketID + "] " + sentString); }
/// <summary> /// Detach pair /// </summary> public void DetachPair() { if (Paired) { lock (m_generalLock) { if (m_socket1 != null) m_socket1.CallBackObj = null; if (m_socket2 != null) m_socket2.CallBackObj = null; Paired = false; Task t = new Task(delegate() { OnParallelP2PDetached(this, m_socket1, m_socket2); }); t.Start(); m_socket1 = null; m_socket2 = null; } } }
/// <summary> /// Accept callback /// </summary> /// <param name="server">server</param> /// <param name="ipInfo">connection info</param> /// <returns>the socket callback interface</returns> public void OnParallelServerAccepted(IParallelServer server, IParallelSocket socket) { }
public void AddSocket(IParallelSocket socket) { lock (m_listLock) { m_socketList.Add(socket); } Task t = new Task(delegate() { OnParallelRoomJoin(this, socket); }); t.Start(); }