Exemplo n.º 1
0
        public bool Send(byte[] buff, int offset, int count)
        {
            try
            {
                if (!IsConnected())
                {
                    Disconnect();
                    return(false);
                }

                if (Sock.Send(buff, offset, count, SocketFlags.None) <= 0)
                {
                    Disconnect();
                    return(false);
                }
                var data = new DataEventArgs(this, buff, count);
                OnDataSent(this, data);
                return(true);
            }
            catch (Exception ex)
            {
                #if DEBUG
                Console.WriteLine(ex.ToString());
                #endif
                Disconnect();
                return(false);
            }
        }
Exemplo n.º 2
0
        public async Task <RPCResponse> SendAndWait(RPC c)
        {
            var cts = new CancellationTokenSource();

            cts.CancelAfter(TimeSpan.FromSeconds(30));

            var tcs = new TaskCompletionSource <RPCResponse>();

            cts.Token.Register(() =>
            {
                tcs.SetCanceled();
            });
            var nid = Interlocked.Increment(ref CommandId);

            c.id = nid;

            if (CommandQueue.TryAdd(nid, tcs))
            {
                await Sock.Send(c);

                return(await tcs.Task);
            }
            else
            {
                Console.WriteLine("Failed to add command, skipping..");
            }
            return(default);
Exemplo n.º 3
0
        private void Send(string data)
        {
            // Convert the string data to byte data using ASCII encoding.
            var byteData = Encoding.ASCII.GetBytes(data + "|");

            // Begin sending the data to the remote device.
            Sock.Send(byteData);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Send a packet to the other end
        /// </summary>
        /// <param name="ID">Packet identifier</param>
        /// <param name="Data">Byte array with Payload.</param>
        public void SendMessage(byte ID, byte[] Data)
        {
            byte[] Packet       = new byte[3 + Data.Length];
            byte[] PacketLength = new byte[2];
            PacketLength = System.BitConverter.GetBytes(Data.Length);
            Packet[0]    = PacketLength[0];
            Packet[1]    = PacketLength[1];
            Packet[2]    = ID;
            Data.CopyTo(Packet, 3);

            Sock.Send(Packet);
        }
Exemplo n.º 5
0
 internal void SendData(byte[] data)
 {
     Sock.Send(data);
 }
Exemplo n.º 6
0
        static void Main(string[] args)
        {
            var webSocket = new WebSocketServer("ws://0.0.0.0:30709");

            webSocket.Start(
                Sock =>
            {
                //Sock.OnOpen = () => Logger.Write("Anonymous Socket Connected");
                Sock.OnClose = () =>
                {
                    UserList.ToList().ForEach((each) =>
                    {
                        if (each.Value.Socket == Sock)
                        {
                            each.Value.Socket.Close();
                            each.Value.Socket = null;
                        }
                    });
                };

                Sock.OnMessage = (Message) =>
                {
                    string[] SplitText = Message.Split('|');
                    string User        = SplitText[1];

                    switch (SplitText[0])
                    {
                    case "MyNameIs":
                        if (UserList.ContainsKey(SplitText[1]))
                        {
                            if (UserList[User].Socket == null)
                            {
                                UserList[User].Socket = Sock;
                                Logger.Write("[{0}] Connected", User);
                            }
                            else if (UserList[User].Socket.IsAvailable)
                            {
                                Logger.Write("[Server] Already Connected in Server");
                                Sock.Send("AlreadyConnected");
                                return;
                            }
                        }
                        else
                        {
                            UserList.Add(User, new UserObject(User, 10000000, Sock));
                            Logger.Write("[Server] new User => {0}", User);
                            Logger.Write("[{0}] Connected", User);
                        }

                        if (Running)
                        {
                            Sock.Send("GameStart");

                            string Stocks = string.Empty;

                            StockList.ForEach(Stock =>
                            {
                                Stocks += $"|{Stock.Name}|{Stock.Price}";
                            });

                            Sock.Send($"HelloClient|{UserList[User].Point}{Stocks}");

                            Stocks = string.Empty;

                            UserList[User].Stock.ToList().ForEach(
                                Each =>
                            {
                                Stocks += $"|{Each.Key}|{Each.Value}";
                            }
                                );

                            Sock.Send($"MyStocks{Stocks}");
                        }
                        else
                        {
                            Sock.Send("Wait");
                        }
                        break;

                    case "Buy":
                        try
                        {
                            StockList.ForEach((Each) =>
                            {
                                if (Each.Name == SplitText[2] &&
                                    Each.Price * int.Parse(SplitText[3]) <= UserList[User].Point)
                                {
                                    UserList[User].BuyStock(Each.Name, Each.Price, int.Parse(SplitText[3]));

                                    Sock.Send($"BuySuccess|{UserList[User].Point}|{Each.Name}|{UserList[User].Stock[Each.Name]}");

                                    Logger.Write($"[{UserList[User].Name}] Buy {Each.Name} {Each.Price}원 {SplitText[3]}개");
                                    return;
                                }
                            });
                        }
                        catch (Exception ex)
                        {
                            Logger.Write("[Exception_Buy]", ex.Message);
                        }
                        break;

                    case "Sell":
                        try
                        {
                            StockList.ForEach((Each) =>
                            {
                                if (Each.Name == SplitText[2] &&
                                    UserList[User].Stock.ContainsKey(SplitText[2]) &&
                                    UserList[User].Stock[SplitText[2]] >= int.Parse(SplitText[3]))
                                {
                                    UserList[User].SellStock(Each.Name, Each.Price, int.Parse(SplitText[3]));

                                    Sock.Send($"SellSuccess|{UserList[User].Point}|{Each.Name}|{UserList[User].Stock[Each.Name]}");

                                    Logger.Write($"[{UserList[User].Name}] Sell {Each.Name} {Each.Price}원 {SplitText[3]}개");
                                    return;
                                }
                            });
                        }
                        catch (Exception ex)
                        {
                            Logger.Write("[Exception_Sell]", ex.Message);
                        }
                        break;

                    case "GetPrice":
                        UserList[User].GetPrice = true;
                        break;

                    case "Prev":
                        //Logger.Write(StockList[int.Parse(SplitText[2])].StockLog.ToString());
                        UserList[User].Socket.Send("PrevPrice|" + StockList[int.Parse(SplitText[2])].StockLog.ToString());
                        break;

                    default:

                        break;
                    }
                };
            }
                );

Cmd:
            var StrArg = Console.ReadLine();
            var Cmd = StrArg.Split();

            switch (Cmd[0].ToLower())
            {
            case "delisting":
                if (StockList.Count < int.Parse(Cmd[1]))
                {
                    Logger.Write("[Server] Stock Not Found");
                    goto Cmd;
                }

                if (StockList[int.Parse(Cmd[1])].Delisting)
                {
                    Logger.Write("[Server] Already Delisting");
                }
                else
                {
                    StockList[int.Parse(Cmd[1])].Delisting = true;
                    StockList[int.Parse(Cmd[1])].Price     = 0;
                }
                goto Cmd;

            case "clearsocket":
                string UserName = StrArg.Replace("clearsocket ", "");
                if (UserList.ContainsKey(UserName))
                {
                    UserList[UserName].Socket.Close();
                    UserList[UserName].Socket = null;
                }
                else
                {
                    Logger.Write("[Server] User Not Found");
                }
                goto Cmd;

            case "start":
                if (!Running)
                {
                    Logger.Write("[==========시작==========]");

                    foreach (var Name in Const.StockNames)
                    {
                        var Stk = new Stock(Name, Utils.Price(), (int)Utils.GetValue(8, 11));
                        StockList.Add(Stk);
                        Logger.Write("[Server] Create Stock:" + Name);
                    }

                    UserList.ToList().ForEach(
                        Each =>
                    {
                        string Stocks = string.Empty;

                        StockList.ForEach(Stock =>
                        {
                            Stocks += $"|{Stock.Name}|{Stock.Price}";
                        });

                        if (Each.Value.Socket != null)
                        {
                            Each.Value.Socket.Send("GameStart");
                            Each.Value.Socket.Send($"HelloClient|{Each.Value.Point}{Stocks}");
                        }
                    }
                        );

                    Running = true;
                    new Thread(() =>
                    {
                        doThread();
                    })
                    {
                        IsBackground = true
                    }.Start();
                }
                else
                {
                    Logger.Write("[Server] Already Started");
                }

                goto Cmd;

            case "stop":
                Running = false;
                goto Cmd;

            case "exit":

                goto End;

            default:

                goto Cmd;
            }

End:
            UserList.ToList().ForEach(
                Each =>
            {
                if (Each.Value.Socket != null &&
                    Each.Value.Socket.IsAvailable)
                {
                    Each.Value.Socket.Close();
                }
                Each.Value.Socket = null;
            }
                );
            Running = false;
        }