Exemplo n.º 1
0
        void AcceptCallback(IAsyncResult ar)
        {
            Socket client = mainSocket.EndAccept(ar);

            mainSocket.BeginAccept(AcceptCallback, null);

            Element_Async obj = new Element_Async(4096);

            obj.WorkingSocket = client;

            connectedClients.Add(client);
            AppendText(txt_chat, string.Format("client connect" + connectedClients.Count));
            client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Exemplo n.º 2
0
        void DataReceived(IAsyncResult ar)
        {
            Element_Async obj = (Element_Async)ar.AsyncState;

            int received = obj.WorkingSocket.EndReceive(ar);

            if (received <= 0)
            {
                obj.WorkingSocket.Close();
                return;
            }

            byte[] byteType = new byte[4];
            Buffer.BlockCopy(obj.Buffer, 0, byteType, 0, 4);
            string text = Encoding.UTF8.GetString(byteType);


            if (text.Equals("text"))
            {
                byte[] byteMessage = new byte[obj.BufferSize - 4];
                Buffer.BlockCopy(obj.Buffer, 4, byteMessage, 0, obj.BufferSize - 4);
                string   message = Encoding.UTF8.GetString(byteMessage);
                string[] tokens  = message.Split('\x01');
                string   _id     = tokens[0];
                string   _msg    = tokens[1];

                AppendText(txt_chat, string.Format("{0}: {1}", _id, _msg));
            }
            else if (text.Equals("exit"))
            {
                for (int i = connectedClients.Count - 1; i >= 0; i--)
                {
                    if (connectedClients[i] == obj.WorkingSocket)
                    {
                        connectedClients.RemoveAt(i);
                        break;
                    }
                }
            }
            else
            {
                using (MemoryStream stream = new MemoryStream(obj.Buffer))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    stream.Position = 0;

                    all_shapes[nobject] = (winform_client.All_Shapes)bf.Deserialize(stream);
                    nobject++;
                    if (panel.InvokeRequired)
                    {
                        panel.Invoke(new MethodInvoker(delegate()
                        {
                            panel.Invalidate(true);
                            panel.Update();
                        }));
                    }
                }
            }
            for (int i = connectedClients.Count - 1; i >= 0; i--)
            {
                Socket socket = connectedClients[i];
                if (socket != obj.WorkingSocket)
                {
                    try
                    {
                        socket.Send(obj.Buffer);
                    }
                    catch
                    {
                        try
                        {
                            socket.Dispose();
                        }
                        catch { }
                        connectedClients.RemoveAt(i);
                    }
                }
            }


            obj.ClearBuffer();

            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }