Esempio n. 1
0
        private void handleDataReceive(IAsyncResult ar)
        {
            // 넘겨진 추가 정보를 가져옵니다.
            // AsyncState 속성의 자료형은 Object 형식이기 때문에 형 변환이 필요합니다~!
            AsyncObject ao = (AsyncObject)ar.AsyncState;

            // 자료를 수신하고, 수신받은 바이트를 가져옵니다.
            Int32 recvBytes = ao.WorkingSocket.EndReceive(ar);

            // 수신받은 자료의 크기가 1 이상일 때에만 자료 처리
            if (recvBytes > 0)
            {
                string message = new UTF8Encoding().GetString(ao.Buffer, 0, recvBytes);
                Console.WriteLine("메세지 받음: {0}", message);
                this.Invoke(new MethodInvoker(delegate
                {
                    txtLog.AppendLine(string.Format("메세지 받음: {0}", message));
                }));
            }
            // 자료 처리가 끝났으면~
            // 이제 다시 데이터를 수신받기 위해서 수신 대기를 해야 합니다.
            // Begin~~ 메서드를 이용해 비동기적으로 작업을 대기했다면
            // 반드시 대리자 함수에서 End~~ 메서드를 이용해 비동기 작업이 끝났다고 알려줘야 합니다!
            ao.WorkingSocket.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao);
        }
Esempio n. 2
0
        private void handleDataSend(IAsyncResult ar)
        {
            // 넘겨진 추가 정보를 가져옵니다.
            AsyncObject ao = (AsyncObject)ar.AsyncState;

            // 자료를 전송하고, 전송한 바이트를 가져옵니다.
            Int32 sentBytes = ao.WorkingSocket.EndSend(ar);

            if (sentBytes > 0)
            {
                Console.WriteLine("메세지 보냄: {0}", Encoding.Unicode.GetString(ao.Buffer));
                txtLog.AppendLine(string.Format("메세지 보냄: {0}", Encoding.Unicode.GetString(ao.Buffer)));
            }
        }
Esempio n. 3
0
        //Client fires when a connection signal comes in callback
        private void AcceptCallback(IAsyncResult asyncResult)
        {
            try
            {
                Socket client = serverSocket.EndAccept(asyncResult);
                serverSocket.BeginAccept(AcceptCallback, null);

                AsyncObject asyncObject = new AsyncObject(4096);
                asyncObject.WorkingSocket = client;
                connectClientList.Add(client);

                AppendText("IP: " + client.RemoteEndPoint);
                client.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject);
            }
            catch { }
        }
Esempio n. 4
0
        private void handleClientConnectionRequest(IAsyncResult ar)
        {
            // 클라이언트의 연결 요청을 수락합니다.
            Socket sockClient = m_ServerSocket.EndAccept(ar);

            // 4096 바이트의 크기를 갖는 바이트 배열을 가진 AsyncObject 클래스 생성
            AsyncObject ao = new AsyncObject(4096);

            // 작업 중인 소켓을 저장하기 위해 sockClient 할당
            ao.WorkingSocket = sockClient;


            SendMessage("접속을 확인합니다.");


            // 비동기적으로 들어오는 자료를 수신하기 위해 BeginReceive 메서드 사용!
            sockClient.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao);
        }
Esempio n. 5
0
        public void SendMessage(String message)
        {
            // 추가 정보를 넘기기 위한 변수 선언
            // 크기를 설정하는게 의미가 없습니다.
            // 왜냐하면 바로 밑의 코드에서 문자열을 유니코드 형으로 변환한 바이트 배열을 반환하기 때문에
            // 최소한의 크기르 배열을 초기화합니다.
            AsyncObject ao = new AsyncObject(1);

            //byte[] buffer = new UTF8Encoding().GetBytes(message);
            // 문자열을 바이트 배열으로 변환
            ao.Buffer = new UTF8Encoding().GetBytes(message);

            // 사용된 소켓을 저장
            ao.WorkingSocket = m_ServerSocket;

            // 전송 시작!
            m_ServerSocket.BeginSend(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnSendHandler, ao);
        }
Esempio n. 6
0
        // Data를 받았을 때 시작되는 Callback
        private void ReceiveData(IAsyncResult asyncResult)
        {
            AsyncObject asyncObject = asyncResult.AsyncState as AsyncObject;

            try { asyncObject.WorkingSocket.EndReceive(asyncResult); }
            catch
            {
                asyncObject.WorkingSocket.Close();
                return;
            }

            string text = Encoding.UTF8.GetString(asyncObject.Buffer);

            string[] tokens = text.Split('\x01');
            try
            {
                if (tokens[1][0] == '\x02')
                {
                    AppendText(tokens[0] + "님이 입장하셨습니다. ( 현재 인원 : " + connectClientList.Count + "명");
                    try { dataGridView.Rows.Add(new string[] { tokens[0] }); }
                    catch { }
                }
                else if (tokens[1][0] == '\x03')
                {
                    AppendText(tokens[0] + "님이 퇴장하셨습니다. (현재 인원 : " + (connectClientList.Count - 1) + "명");
                    try
                    {
                        for (int i = 0; i < dataGridView.Rows.Count; i++)
                        {
                            if (tokens[0] == dataGridView.Rows[i].Cells[0].Value as string)
                            {
                                dataGridView.Rows.RemoveAt(i);
                                break;
                            }
                        }
                    }
                    catch { }
                }
                else
                {
                    AppendText("[받음] " + tokens[0] + " : " + tokens[1]);
                }
            }
            catch { }
            for (int i = connectClientList.Count - 1; i >= 0; i--)
            {
                Socket tempSocket = connectClientList[i];
                if (tempSocket != asyncObject.WorkingSocket)
                {
                    try { tempSocket.Send(asyncObject.Buffer); }
                    catch
                    {
                        tempSocket.Close();
                        connectClientList.RemoveAt(i);
                    }
                }
            }

            asyncObject.ClearBuffer();
            try { asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject); }
            catch
            {
                asyncObject.WorkingSocket.Close();
                connectClientList.Remove(asyncObject.WorkingSocket);
            }
        }
Esempio n. 7
0
        //Data start when you recieve callback
        private void ReceiveData(IAsyncResult asyncResult)
        {
            AsyncObject asyncObject = asyncResult.AsyncState as AsyncObject;

            try { asyncObject.WorkingSocket.EndReceive(asyncResult); }
            catch
            {
                asyncObject.WorkingSocket.Close();
                return;
            }

            string text = Encoding.UTF8.GetString(asyncObject.Buffer);

            string[] tokens = text.Split('\x01');
            try
            {
                if (tokens[1][0] == '\x02')
                {
                    //shows user joining and displays number of users in server
                    AppendText(tokens[0] + " has joined (current people: " + connectClientList.Count + " people)");
                    try { dgvUsernames.Rows.Add(new string[] { tokens[0] }); }
                    catch { }
                }
                else if (tokens[1][0] == '\x03')
                {
                    //shows user leaving and displays number of users in server
                    AppendText(tokens[0] + " has left (current people: " + (connectClientList.Count - 1) + " people)");
                    try
                    {
                        for (int i = 0; i < dgvUsernames.Rows.Count; i++)
                        {
                            if (tokens[0] == dgvUsernames.Rows[i].Cells[0].Value as string)
                            {
                                dgvUsernames.Rows.RemoveAt(i);
                                break;
                            }
                        }
                    }
                    catch { }
                }
                //message recieved from client
                else
                {
                    AppendText("[Recieved] " + tokens[0] + ": " + tokens[1]);
                }
            }
            catch { }
            for (int i = connectClientList.Count - 1; i >= 0; i--)
            {
                Socket tempSocket = connectClientList[i];
                if (tempSocket != asyncObject.WorkingSocket)
                {
                    try { tempSocket.Send(asyncObject.Buffer); }
                    catch
                    {
                        tempSocket.Close();
                        connectClientList.RemoveAt(i);
                    }
                }
            }

            asyncObject.ClearBuffer();
            try { asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject); }
            catch
            {
                asyncObject.WorkingSocket.Close();
                connectClientList.Remove(asyncObject.WorkingSocket);
            }
        }