Exemple #1
0
        // 데이터 받는 함수
        private void DataReceived(IAsyncResult ar)
        {
            // BeginRecvied에서 추가로 넘어온 데이터를 AysncObject클래스 형식으로 변환
            // AsyncCallback 메소드는 IAsyncResult 객체의 AsyncState 속성을 사용하여 원래의 소캣 객체 재생성
            // EndAccpet() 호출되면, IAsyncResult 객체를 통해 호출한 BeginAccept()과 대응한다
            // EndAccpet() 은 원격 클라이언트와 통신하는데 사용할 새로운 소켓 객체를 반환
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            // 데이터 수신 끝내기
            if (_client.Connected)
            {
                try
                {
                    int received = obj._workingSocket.EndReceive(ar);
                    // 받은 데이터 없으면 비동기 연결끝
                    if (received <= 0)
                    {
                        obj._workingSocket.Close();
                        return;
                    }
                    // 텍스트로 변환
                    // "192.168.2.157 : port % t % mms"
                    string text = Encoding.Default.GetString(obj._buffer);

                    string[] token = text.Split('%');
                    string   port  = token[0];

                    string[] _port   = token[0].Split(':');
                    string   _portip = _port[1];

                    string check   = token[1];
                    string message = token[2];

                    MessageConverter(message, check);


                    if (check.Equals("t@"))
                    {
                        if (lbox_ChatLog.InvokeRequired)
                        {
                            lbox_ChatLog.Invoke(new Action(delegate()
                            {
                                lbox_ChatLog.Items.Add("[클라이언트" + _portip + "] : " + message);
                            }));
                        }
                        else
                        {
                            lbox_ChatLog.Items.Add("[클라이언트" + _portip + "] : " + message);
                        }
                    }
                    else if (check.Equals("p@"))
                    {
                        if (lbox_Content.InvokeRequired)
                        {
                            lbox_Content.Invoke(new Action(delegate()
                            {
                                lbox_Content.Items.Add("[클라이언트" + _portip + "] : " + message);
                            }));
                        }
                        else                                          //_client.RemoteEndPoint
                        {
                            lbox_Content.Items.Add("[클라이언트" + _portip + "] : " + message);
                        }
                    }


                    Console.WriteLine(_connectedClients.Count);
                    // 모든 클라이언트들에게 데이터전송
                    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 = AcceptCallback 함수의 client
                    obj._workingSocket.BeginReceive(obj._buffer, 0, 4096, 0, DataReceived, obj); //같은방법으로 수신대기
                }
                catch (SocketException se)
                {
                    se.Message.ToString();
                }
            }
        }
Exemple #2
0
        // 콜백함수
        private void AcceptCallback(IAsyncResult ar)
        {
            // 클라이언트 연결 요청 수락
            try
            {
                _client = _mainSock.EndAccept(ar);
                // 또 다른 클라이언트 연결 대기
                _mainSock.BeginAccept(AcceptCallback, null);

                AsyncObject obj = new AsyncObject(4096);
                obj._workingSocket = _client;
                // 연결된 클라이언트를 리스트에 추가
                _connectedClients.Add(_client);
                // 처음 통신 시작 할 때, 모든 데이터를 clinet에게 넘겨준다.
                // 문자열이 아닌 객체로 보내는 방법으로 생각해보자.
                // 초기 연결!!!!
                if (_connectedClients.Contains(_client))
                {
                    string message = "";
                    if (_moveShapeSetting.Count >= 1)
                    {
                        foreach (KeyValuePair <string, Setting> kv in _moveShapeSetting)
                        {
                            List <Point> pts       = kv.Value.Points;
                            String       _shape    = kv.Value.Shape;
                            Color        _color    = kv.Value.Color;
                            int          _width    = kv.Value.Width;
                            String       _pointKey = kv.Key;
                            Console.WriteLine(_shape);
                            string strPoint = string.Format("POINTS:{0},{1},{2},{3}@", pts[0].X, pts[0].Y, pts[1].X, pts[1].Y);
                            string strShpae = string.Format("SHAPE:{0}@", _shape);
                            string strColor = string.Format("COLOR:{0},{1},{2},{3}@", _color.A, _color.R, _color.G, _color.B);
                            string strWidth = string.Format("WIDTH:{0}@", _width);
                            string strKey   = string.Format("STR KEY:{0}", _pointKey);

                            message += strShpae;
                            message += strColor;
                            message += strWidth;
                            message += strPoint;
                            message += strKey;
                            message += '+';
                        }

                        // SHAPE:RECT@COLOR:255,255,0,0@WIDTH:2@POINTS:10,10,100,100@STR KEY:_pointKey
                        SendMessage(message, 12);
                    }
                }



                if (lbox_Content.InvokeRequired)
                {
                    lbox_Content.Invoke(new Action(delegate()
                    {
                        lbox_Content.Items.Add("[클라이언트" + _client.RemoteEndPoint + "] : 연결");
                    }));
                }
                else
                {
                    lbox_Content.Items.Add("[클라이언트" + _client.RemoteEndPoint + "] : 연결");
                }
                // 클라이언트 데이터 받기
                _client.BeginReceive(obj._buffer, 0, 4096, 0, DataReceived, obj);
            }
            catch (Exception ex)
            {
                ex.Message.ToString();
            }
        }