Ejemplo n.º 1
0
        private void ProcessPacket()
        {
            if (_packetQueue.Count <= 0)
            {
                return;
            }

            Packet packet = _packetQueue.Dequeue();

            AsyncObject obj = new AsyncObject(BufferSize);

            if (packet.PacketType.n == (int)PacketType.USER_INFO)
            {
                PacketUserInfo userInfo = packet as PacketUserInfo;

                if (userInfo != null)
                {
                    ProcessSendMessage(userInfo);
                }
            }
            else if (packet.PacketType.n == (int)PacketType.ROUND_INFO)
            {
                PacketRoundInfo roundInfo = packet as PacketRoundInfo;

                if (roundInfo != null)
                {
                    ProcessSendMessage(roundInfo);
                }
            }
        }
Ejemplo n.º 2
0
        // 클라 연결 함수
        void AcceptCallback(IAsyncResult ar)
        {
            Socket client = mainSock.EndAccept(ar);

            mainSock.BeginAccept(AcceptCallback, null);
            AsyncObject obj = new AsyncObject(81920);

            obj.WorkingSocket = client;
            connectedClients.Add(client);
            this.Invoke(new MethodInvoker(delegate() { ClientList.Items.Add(client.RemoteEndPoint); }));
            string iptext = "9" + '\x01';

            for (int i = connectedClients.Count - 1; i >= 0; i--)
            {
                iptext += connectedClients[i].RemoteEndPoint.ToString() + '\x01';
            }
            byte[] lbip = Encoding.UTF8.GetBytes(iptext);
            for (int i = connectedClients.Count - 1; i >= 0; i--)
            {
                Socket socket = connectedClients[i];
                try { socket.Send(lbip); }
                catch
                {
                    try { socket.Dispose(); } catch { }
                    connectedClients.RemoveAt(i);
                }
            }
            AppendText(txtHistory, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint));
            client.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj);
        }
Ejemplo n.º 3
0
        // 클라 연결 함수
        void AcceptCallback(IAsyncResult ar)
        {
            Socket client = mainSock.EndAccept(ar);

            mainSock.BeginAccept(AcceptCallback, null);
            AsyncObject obj = new AsyncObject(50000);

            obj.WorkingSocket = client;
            connectedClients.Add(client);
            client.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj);
        }
Ejemplo n.º 4
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                obj.WorkingSocket.Close();
                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            // 0x01 기준으로 짜른다.
            // tokens[0] - 보낸 사람 IP
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split('\x01');
            string   ip     = tokens[0];
            string   msg    = tokens[1];

            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            AppendText(txtHistory, string.Format("[받음]{0}: {1}", ip, msg));

            // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다.
            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);
        }
        void AcceptCallback(IAsyncResult ar)
        {
            // 클라이언트의 연결 요청을 수락한다.
            Socket client = mainSock.EndAccept(ar);

            // 또 다른 클라이언트의 연결을 대기한다.
            mainSock.BeginAccept(AcceptCallback, null);

            AsyncObject obj = new AsyncObject(4096);// 4096 buffer size

            obj.WorkingSocket = client;

            AppendText(txtHistory, string.Format("클라이언트 접속 : @{0}", client.RemoteEndPoint));

            // 클라이언트의 ID 데이터를 받는다.
            client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Ejemplo n.º 6
0
        void AcceptCallback(IAsyncResult ar)
        {
            // 클라이언트의 연결 요청을 수락한다.
            Socket client = mainSock.EndAccept(ar);

            // 또 다른 클라이언트의 연결을 대기한다.
            mainSock.BeginAccept(AcceptCallback, null);

            AsyncObject obj = new AsyncObject(4096);

            obj.WorkingSocket = client;

            // 연결된 클라이언트 리스트에 추가해준다.
            connectedClients.Add(client);

            // 텍스트박스에 클라이언트가 연결되었다고 써준다.
            AppendText(txtHistory, string.Format("클라이언트 (@ {0})가 연결되었습니다.", client.RemoteEndPoint));

            // 클라이언트의 데이터를 받는다.
            client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Ejemplo n.º 7
0
        private void StreamReceive(IAsyncResult ar)
        {
            lock (_lock)
            {
                AsyncObject obj = (AsyncObject)ar.AsyncState;

                try
                {
                    int len = obj.WorkingSocket.EndReceive(ar);

                    for (int i = 0; i < len; i++)
                    {
                        _byteList.Add(obj.Buffer[i]);
                    }
                    obj.ClearBuffer();
                    obj.WorkingSocket.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, StreamReceive, obj);
                }
                catch (Exception ex)
                {
                }

                ProcessStreamByte();
            }
        }
Ejemplo n.º 8
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            try
            {
                // 데이터 수신을 끝낸다.
                int received = obj.WorkingSocket.EndReceive(ar);

                // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
                if (received <= 0)
                {
                    obj.WorkingSocket.Disconnect(false);
                    obj.WorkingSocket.Close();
                    return;
                }

                Console.WriteLine(obj.Buffer);
                // 텍스트로 변환한다.
                string text = Encoding.UTF8.GetString(obj.Buffer);
                Console.WriteLine("데이터 브로드 캐스트" + text);
                string[] arrayText;
                arrayText = text.ToString().Split('?');
                DataForm data = new DataForm();
                data = JsonConvert.DeserializeObject <DataForm>(arrayText[0]);
                if (data.req == null)
                {
                    MsgBoxHelper.Error("null");
                    data.req = "";
                }
                if (data.req.Equals("close"))
                {
                    MsgBoxHelper.Error("close 들어옴");
                    Console.WriteLine("close 들어옴");
                    obj.WorkingSocket.Disconnect(false);
                    obj.WorkingSocket.Close();
                }

                // 텍스트박스에 추가해준다.
                // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
                // 따라서 대리자를 통해 처리한다.


                AppendText(txtHistory, string.Format("[받음]{0}: {1}", data.id, data.text));

                // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다.
                for (int i = connectedClients.Count - 1; i >= 0; i--)
                {
                    Socket socket = connectedClients[i];
                    if (socket != obj.WorkingSocket)
                    {
                        try
                        {
                            string request = JsonConvert.SerializeObject(data);
                            AESEncrypt256(request, key);
                            Encoding.UTF8.GetBytes(AESEncrypt256(request, key));
                            Console.WriteLine("이 암호화된 내용으로 브로드 캐스팅 : " + AESEncrypt256(request, key));
                            socket.Send(Encoding.UTF8.GetBytes(AESEncrypt256(request, key)));
                        }
                        catch
                        {
                            // 오류 발생하면 전송 취소하고 리스트에서 삭제한다.
                            try { socket.Dispose(); } catch { }
                            // connectedClients.RemoveAt(i);
                        }
                    }
                }

                // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
                obj.ClearBuffer();

                // 수신 대기
                obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
            }
            catch
            {
            }
        }
Ejemplo n.º 9
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                //AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum));

                if (clientNum > 0)
                {
                    foreach (KeyValuePair <string, Socket> clients in connectedClients)
                    {
                        if (obj.WorkingSocket == clients.Value)
                        {
                            string key = clients.Key;
                            try
                            {
                                connectedClients.Remove(key);
                            }
                            catch { }
                            break;
                        }
                    }
                }
                obj.WorkingSocket.Disconnect(false);
                obj.WorkingSocket.Close();
                clientNum--;
                // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum));

                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            AppendText(txtHistory, text);


            // : 기준으로 짜른다.
            // tokens[0] - 보낸 사람 ID
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split(':');
            string   id     = null;

            if (tokens[0].Equals("JUM"))
            {
                string jum_id = tokens[1];
                string jum    = tokens[2];
                byte[] bDts   = Encoding.UTF8.GetBytes("JUM" + ':' + jum_id + ":" + jum);
                // 연결된 모든 클라이언트에게 전송한다.
            }
            if (tokens[0].Equals("id"))
            {
                clientNum++;
                id = tokens[1];
                AppendText(txtHistory, string.Format("[접속{0}]ID : {1}", clientNum, id));

                // 연결된 클라이언트 리스트에 추가해준다.
                connectedClients.Add(id, obj.WorkingSocket);
            }
            else
            {
                id = tokens[0];
                string msg = tokens[1];
                AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
            }
            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));

            // 전체 클라이언트에게 데이터를 보낸다.
            sendAll(obj.WorkingSocket, obj.Buffer);


            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();
            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Ejemplo n.º 10
0
        // 데이터 수신 함수
        void DataReceived(IAsyncResult ar)
        {
            AsyncObject obj  = (AsyncObject)ar.AsyncState;
            string      text = Encoding.UTF8.GetString(obj.Buffer);

            string[] arrDts = text.Split('\x01');
            Random   rand   = new Random();

            this.Invoke(new MethodInvoker(delegate
            {
                if (arrDts[0] == "1") // 전체톡
                {
                    AppendText(txtHistory, string.Format("[받음]{0}: {1}", arrDts[1], arrDts[2]));
                    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);
                            }
                        }
                    }
                }
                else if (arrDts[0] == "2") // 게임톡
                {
                    int cnt       = int.Parse(arrDts[5]);
                    int x         = 0;
                    string sendDt = "";
                    if (arrDts[4] == ans)
                    {
                        if (anslist[10] != "")
                        {
                            arrDts[0] = "6";
                            arrDts[4] = ans;
                            foreach (string str in arrDts)
                            {
                                sendDt += arrDts[x] + '\x01';
                                x++;
                                if (x == 6)
                                {
                                    sendDt += "!" + '\x01';
                                }
                            }
                            byte[] sendByt = Encoding.UTF8.GetBytes(sendDt);
                            for (int j = cnt + 5; j >= 6; j--)
                            {
                                string nip = "";
                                for (int k = 0; k < ClientList.Items.Count; k++)
                                {
                                    if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                                    {
                                        nip = ClientList.Items[k].SubItems[0].Text;
                                        break;
                                    }
                                }
                                if (nip != "")
                                {
                                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                                    {
                                        if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                        {
                                            Socket socket = connectedClients[i];
                                            try { socket.Send(sendByt); }
                                            catch
                                            {
                                                try { socket.Dispose(); } catch { }
                                                connectedClients.RemoveAt(i);
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                            ans = "";
                        }
                        else
                        {
                            int ranpbm = 0;
                            int endi   = 1;
                            while (endi != 0)
                            {
                                endi   = 0;
                                ranpbm = rand.Next(0, problem.Length);
                                for (int j = 1; j < anslist.Length; j++)
                                {
                                    if (anslist[j] == "")
                                    {
                                        break;
                                    }
                                    if (problem[ranpbm] == anslist[j])
                                    {
                                        endi++;
                                    }
                                }
                            }
                            arrDts[0] = "5";
                            arrDts[3] = ans;
                            arrDts[4] = problem[ranpbm];
                            for (int i = 0; i < anslist.Length; i++)
                            {
                                if (anslist[i] == "")
                                {
                                    anslist[i] = arrDts[4];
                                    break;
                                }
                            }
                            ans = arrDts[4];
                            foreach (string str in arrDts)
                            {
                                sendDt += arrDts[x] + '\x01';
                                x++;
                            }
                            byte[] sendBt = Encoding.UTF8.GetBytes(sendDt);
                            for (int j = cnt + 5; j >= 6; j--)
                            {
                                string nip = "";
                                for (int k = 0; k < ClientList.Items.Count; k++)
                                {
                                    if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                                    {
                                        nip = ClientList.Items[k].SubItems[0].Text;
                                        break;
                                    }
                                }
                                if (nip != "")
                                {
                                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                                    {
                                        if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                        {
                                            Socket socket = connectedClients[i];
                                            try { socket.Send(sendBt); }
                                            catch
                                            {
                                                try { socket.Dispose(); } catch { }
                                                connectedClients.RemoveAt(i);
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        for (int j = cnt + 5; j >= 6; j--)
                        {
                            string nip = "";
                            for (int k = 0; k < ClientList.Items.Count; k++)
                            {
                                if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                                {
                                    nip = ClientList.Items[k].SubItems[0].Text;
                                    break;
                                }
                            }
                            if (nip != "")
                            {
                                for (int i = connectedClients.Count - 1; i >= 0; i--)
                                {
                                    if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                    {
                                        Socket socket = connectedClients[i];
                                        if (socket != obj.WorkingSocket)
                                        {
                                            try { socket.Send(obj.Buffer); }
                                            catch
                                            {
                                                try { socket.Dispose(); } catch { }
                                                connectedClients.RemoveAt(i);
                                            }
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                else if (arrDts[0] == "3") // 그림전송
                {
                    int cnt = int.Parse(arrDts[3]);
                    for (int j = cnt + 3; j >= 4; j--)
                    {
                        string nip = "";
                        for (int k = 0; k < ClientList.Items.Count; k++)
                        {
                            if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                            {
                                nip = ClientList.Items[k].SubItems[0].Text;
                                break;
                            }
                        }
                        if (nip != "")
                        {
                            for (int i = connectedClients.Count - 1; i >= 0; i--)
                            {
                                if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                {
                                    Socket socket = connectedClients[i];
                                    if (socket != obj.WorkingSocket)
                                    {
                                        try { socket.Send(obj.Buffer); }
                                        catch
                                        {
                                            try { socket.Dispose(); } catch { }
                                            connectedClients.RemoveAt(i);
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
                else if (arrDts[0] == "4")
                {
                    int cnt = int.Parse(arrDts[4]);
                    if (arrDts[5] == "3")
                    {
                        anslist    = new string[] { "", "", "", "", "", "", "", "", "", "", "" };
                        anslist[0] = arrDts[1];
                        int ran    = rand.Next(6, cnt + 6);
                        int ranpbm = rand.Next(0, problem.Length);
                        while (arrDts[ran].Equals(arrDts[3]))
                        {
                            ran = rand.Next(6, cnt + 6);
                        }
                        arrDts[3]     = arrDts[ran];
                        arrDts[5]     = problem[ranpbm];
                        anslist[1]    = arrDts[5];
                        ans           = arrDts[5];
                        string sendDt = "";
                        int x         = 0;
                        foreach (string str in arrDts)
                        {
                            sendDt += arrDts[x] + '\x01';
                            x++;
                        }
                        byte[] sendBt = Encoding.UTF8.GetBytes(sendDt);
                        for (int j = cnt + 5; j >= 6; j--)
                        {
                            string nip = "";
                            for (int k = 0; k < ClientList.Items.Count; k++)
                            {
                                if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                                {
                                    nip = ClientList.Items[k].SubItems[0].Text;
                                    break;
                                }
                            }
                            if (nip != "")
                            {
                                for (int i = connectedClients.Count - 1; i >= 0; i--)
                                {
                                    if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                    {
                                        Socket socket = connectedClients[i];
                                        try { socket.Send(sendBt); }
                                        catch
                                        {
                                            try { socket.Dispose(); } catch { }
                                            connectedClients.RemoveAt(i);
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        for (int j = cnt + 5; j >= 6; j--)
                        {
                            string nip = "";
                            for (int k = 0; k < ClientList.Items.Count; k++)
                            {
                                if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                                {
                                    nip = ClientList.Items[k].SubItems[0].Text;
                                    break;
                                }
                            }
                            if (nip != "")
                            {
                                for (int i = connectedClients.Count - 1; i >= 0; i--)
                                {
                                    if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                    {
                                        Socket socket = connectedClients[i];
                                        if (socket != obj.WorkingSocket)
                                        {
                                            try { socket.Send(obj.Buffer); }
                                            catch
                                            {
                                                try { socket.Dispose(); } catch { }
                                                connectedClients.RemoveAt(i);
                                            }
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                else if (arrDts[0] == "5")
                {
                    int cnt       = int.Parse(arrDts[5]);
                    string sendDt = "";
                    int x         = 0;
                    if (anslist[10] != "")
                    {
                        arrDts[0] = "6";
                        arrDts[3] = ans;
                        foreach (string str in arrDts)
                        {
                            sendDt += arrDts[x] + '\x01';
                            x++;
                        }
                        byte[] sendByt = Encoding.UTF8.GetBytes(sendDt);
                        for (int j = cnt + 6; j >= 7; j--)
                        {
                            string nip = "";
                            for (int k = 0; k < ClientList.Items.Count; k++)
                            {
                                if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                                {
                                    nip = ClientList.Items[k].SubItems[0].Text;
                                    break;
                                }
                            }
                            if (nip != "")
                            {
                                for (int i = connectedClients.Count - 1; i >= 0; i--)
                                {
                                    if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                    {
                                        Socket socket = connectedClients[i];
                                        try { socket.Send(sendByt); }
                                        catch
                                        {
                                            try { socket.Dispose(); } catch { }
                                            connectedClients.RemoveAt(i);
                                        }
                                        break;
                                    }
                                }
                            }
                        }
                        ans = "";
                        return;
                    }
                    int ran    = rand.Next(7, cnt + 7);
                    int ranpbm = rand.Next(0, problem.Length);
                    while (arrDts[ran].Equals(arrDts[3]))
                    {
                        ran = rand.Next(7, cnt + 7);
                    }
                    int endi = 1;
                    while (endi != 0)
                    {
                        endi   = 0;
                        ranpbm = rand.Next(0, problem.Length);
                        for (int j = 1; j < anslist.Length; j++)
                        {
                            if (anslist[j] == "")
                            {
                                break;
                            }
                            if (problem[ranpbm] == anslist[j])
                            {
                                endi++;
                            }
                        }
                    }
                    arrDts[2] = arrDts[ran];
                    arrDts[3] = ans;
                    arrDts[4] = problem[ranpbm];
                    for (int i = 0; i < anslist.Length; i++)
                    {
                        if (anslist[i] == "")
                        {
                            anslist[i] = arrDts[4];
                            break;
                        }
                    }
                    ans = arrDts[4];
                    foreach (string str in arrDts)
                    {
                        sendDt += arrDts[x] + '\x01';
                        x++;
                    }
                    byte[] sendBt = Encoding.UTF8.GetBytes(sendDt);
                    for (int j = cnt + 6; j >= 7; j--)
                    {
                        string nip = "";
                        for (int k = 0; k < ClientList.Items.Count; k++)
                        {
                            if (arrDts[j].Equals(ClientList.Items[k].SubItems[1].Text))
                            {
                                nip = ClientList.Items[k].SubItems[0].Text;
                                break;
                            }
                        }
                        if (nip != "")
                        {
                            for (int i = connectedClients.Count - 1; i >= 0; i--)
                            {
                                if (nip.Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                {
                                    Socket socket = connectedClients[i];
                                    try { socket.Send(sendBt); }
                                    catch
                                    {
                                        try { socket.Dispose(); } catch { }
                                        connectedClients.RemoveAt(i);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
                else if (arrDts[0] == "7") // 닉네임 중복검사
                {
                    bool chknick = true;
                    string mssg;
                    for (int i = 0; i < ClientList.Items.Count; i++)
                    {
                        if (arrDts[2].Equals(ClientList.Items[i].SubItems[1].Text))
                        {
                            chknick = false;
                            break;
                        }
                    }
                    if (chknick)
                    {
                        mssg = "1";
                    }
                    else
                    {
                        mssg = "0";
                    }
                    byte[] overlapsd = Encoding.UTF8.GetBytes("7" + '\x01' + mssg + '\x01');
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        if (arrDts[1].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                        {
                            Socket socket = connectedClients[i];
                            try { socket.Send(overlapsd); }
                            catch
                            {
                                try { socket.Dispose(); } catch { }
                                connectedClients.RemoveAt(i);
                            }
                            break;
                        }
                    }
                }
                else if (arrDts[0] == "8")
                {
                    ListViewItem lstitm = new ListViewItem();
                    lstitm.Text         = arrDts[2];
                    lstitm.SubItems.Add(arrDts[3]);
                    ClientList.Items.Add(lstitm);
                    string msg      = "[ " + arrDts[3] + " ]님이 입장하였습니다.";
                    string nicklist = "8" + '\x01' + msg + '\x01';
                    for (int i = 0; i < ClientList.Items.Count; i++)
                    {
                        nicklist += ClientList.Items[i].SubItems[1].Text + '\x01';
                    }
                    byte[] lbip = Encoding.UTF8.GetBytes(nicklist);
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        Socket socket = connectedClients[i];
                        try { socket.Send(lbip); }
                        catch
                        {
                            try { socket.Dispose(); } catch { }
                            connectedClients.RemoveAt(i);
                        }
                    }
                    AppendText(txtHistory, string.Format("클라이언트 (@ {0})가 연결되었습니다.", arrDts[3]));
                }
                else if (arrDts[0] == "9") // 클라이언트 리스트 갱신
                {
                    for (int i = ClientList.Items.Count - 1; i >= 0; i--)
                    {
                        if (ClientList.Items[i].SubItems[1].Text.Equals(arrDts[1]))
                        {
                            ClientList.Items.Remove(ClientList.Items[i]);
                            connectedClients.Remove(connectedClients[i]);
                            break;
                        }
                    }
                    string msg    = "[ " + arrDts[1] + " ]님이 퇴장하였습니다.";
                    string iptext = "9" + '\x01' + msg + '\x01';
                    for (int i = 0; i < ClientList.Items.Count; i++)
                    {
                        iptext += ClientList.Items[i].SubItems[1].Text + '\x01';
                    }
                    byte[] lbip = Encoding.UTF8.GetBytes(iptext);
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        Socket socket = connectedClients[i];
                        try { socket.Send(lbip); }
                        catch
                        {
                            try { socket.Dispose(); } catch { }
                            connectedClients.RemoveAt(i);
                        }
                    }
                    obj.WorkingSocket.Close();
                    return;
                }
            }));
            obj.ClearBuffer();
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj);
        }
Ejemplo n.º 11
0
        // 데이터 수신 함수
        void DataReceived(IAsyncResult ar)
        {
            AsyncObject obj  = (AsyncObject)ar.AsyncState;
            string      text = Encoding.UTF8.GetString(obj.Buffer);

            string[] arrDts = text.Split('\x01');
            Random   rand   = new Random();

            if (arrDts[0] == "1") // 전체톡
            {
                AppendText(txtHistory, string.Format("[받음]{0}: {1}", arrDts[1], arrDts[2]));
                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);
                        }
                    }
                }
            }
            else if (arrDts[0] == "2") // 게임톡
            {
                int    cnt    = int.Parse(arrDts[4]);
                int    x      = 0;
                string sendDt = "";
                if (arrDts[3] == ans)
                {
                    if (anslist[10] != null)
                    {
                        arrDts[0] = "6";
                        arrDts[2] = ans;
                        foreach (string str in arrDts)
                        {
                            sendDt += arrDts[x] + '\x01';
                            x++;
                            if (x == 5)
                            {
                                sendDt += "!" + '\x01';
                            }
                        }
                        byte[] sendByt = Encoding.UTF8.GetBytes(sendDt);
                        for (int j = cnt + 4; j >= 5; j--)
                        {
                            for (int i = connectedClients.Count - 1; i >= 0; i--)
                            {
                                if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                                {
                                    Socket socket = connectedClients[i];
                                    try { socket.Send(sendByt); }
                                    catch
                                    {
                                        try { socket.Dispose(); } catch { }
                                        connectedClients.RemoveAt(i);
                                    }
                                    break;
                                }
                            }
                        }
                        ans = "";
                        return;
                    }
                    int ranpbm = 0;
                    int endi   = 1;
                    while (endi != 0)
                    {
                        endi   = 0;
                        ranpbm = rand.Next(0, problem.Length);
                        for (int j = 1; j < anslist.Length; j++)
                        {
                            if (anslist[j] == null)
                            {
                                break;
                            }
                            if (problem[ranpbm] == anslist[j])
                            {
                                endi++;
                            }
                        }
                    }
                    arrDts[0] = "5";
                    arrDts[2] = ans;
                    arrDts[3] = problem[ranpbm];
                    for (int i = 0; i < anslist.Length; i++)
                    {
                        if (anslist[i] == null)
                        {
                            anslist[i] = arrDts[3];
                            break;
                        }
                    }
                    ans = arrDts[3];
                    foreach (string str in arrDts)
                    {
                        sendDt += arrDts[x] + '\x01';
                        x++;
                    }
                    byte[] sendBt = Encoding.UTF8.GetBytes(sendDt);
                    for (int j = cnt + 4; j >= 5; j--)
                    {
                        for (int i = connectedClients.Count - 1; i >= 0; i--)
                        {
                            if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                            {
                                Socket socket = connectedClients[i];
                                try { socket.Send(sendBt); }
                                catch
                                {
                                    try { socket.Dispose(); } catch { }
                                    connectedClients.RemoveAt(i);
                                }
                                break;
                            }
                        }
                    }
                }
                else
                {
                    for (int j = cnt + 4; j >= 5; j--)
                    {
                        for (int i = connectedClients.Count - 1; i >= 0; i--)
                        {
                            if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                            {
                                Socket socket = connectedClients[i];
                                if (socket != obj.WorkingSocket)
                                {
                                    try { socket.Send(obj.Buffer); }
                                    catch
                                    {
                                        try { socket.Dispose(); } catch { }
                                        connectedClients.RemoveAt(i);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
            else if (arrDts[0] == "3") // 그림전송
            {
                int cnt = int.Parse(arrDts[2]);
                for (int j = cnt + 2; j >= 3; j--)
                {
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                        {
                            Socket socket = connectedClients[i];
                            if (socket != obj.WorkingSocket)
                            {
                                try { socket.Send(obj.Buffer); }
                                catch
                                {
                                    try { socket.Dispose(); } catch { }
                                    connectedClients.RemoveAt(i);
                                }
                            }
                            break;
                        }
                    }
                }
            }
            else if (arrDts[0] == "4")
            {
                int cnt = int.Parse(arrDts[3]);
                if (arrDts[4] == "3")
                {
                    anslist[0] = cnt + "";
                    int ran    = rand.Next(5, cnt + 5);
                    int ranpbm = rand.Next(0, problem.Length);
                    while (arrDts[ran].Equals(arrDts[2]))
                    {
                        ran = rand.Next(5, cnt + 5);
                    }
                    arrDts[2]  = arrDts[ran];
                    arrDts[4]  = problem[ranpbm];
                    anslist[1] = arrDts[4];
                    ans        = arrDts[4];
                    string sendDt = "";
                    int    x      = 0;
                    foreach (string str in arrDts)
                    {
                        sendDt += arrDts[x] + '\x01';
                        x++;
                    }
                    byte[] sendBt = Encoding.UTF8.GetBytes(sendDt);
                    for (int j = cnt + 4; j >= 5; j--)
                    {
                        for (int i = connectedClients.Count - 1; i >= 0; i--)
                        {
                            if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                            {
                                Socket socket = connectedClients[i];
                                try { socket.Send(sendBt); }
                                catch
                                {
                                    try { socket.Dispose(); } catch { }
                                    connectedClients.RemoveAt(i);
                                }
                                break;
                            }
                        }
                    }
                }
                else
                {
                    for (int j = cnt + 4; j >= 5; j--)
                    {
                        for (int i = connectedClients.Count - 1; i >= 0; i--)
                        {
                            if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                            {
                                Socket socket = connectedClients[i];
                                if (socket != obj.WorkingSocket)
                                {
                                    try { socket.Send(obj.Buffer); }
                                    catch
                                    {
                                        try { socket.Dispose(); } catch { }
                                        connectedClients.RemoveAt(i);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
            else if (arrDts[0] == "5")
            {
                int    cnt    = int.Parse(arrDts[4]);
                string sendDt = "";
                int    x      = 0;
                if (anslist[10] != null)
                {
                    arrDts[0] = "6";
                    arrDts[2] = ans;
                    foreach (string str in arrDts)
                    {
                        sendDt += arrDts[x] + '\x01';
                        x++;
                    }
                    byte[] sendByt = Encoding.UTF8.GetBytes(sendDt);
                    for (int j = cnt + 5; j >= 6; j--)
                    {
                        for (int i = connectedClients.Count - 1; i >= 0; i--)
                        {
                            if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                            {
                                Socket socket = connectedClients[i];
                                try { socket.Send(sendByt); }
                                catch
                                {
                                    try { socket.Dispose(); } catch { }
                                    connectedClients.RemoveAt(i);
                                }
                                break;
                            }
                        }
                    }
                    ans = "";
                    return;
                }
                int ran    = rand.Next(6, cnt + 6);
                int ranpbm = rand.Next(0, problem.Length);
                while (arrDts[ran].Equals(arrDts[1]))
                {
                    ran = rand.Next(6, cnt + 6);
                }
                int endi = 1;
                while (endi != 0)
                {
                    endi   = 0;
                    ranpbm = rand.Next(0, problem.Length);
                    for (int j = 1; j < anslist.Length; j++)
                    {
                        if (anslist[j] == null)
                        {
                            break;
                        }
                        if (problem[ranpbm] == anslist[j])
                        {
                            endi++;
                        }
                    }
                }
                arrDts[1] = arrDts[ran];
                arrDts[2] = ans;
                arrDts[3] = problem[ranpbm];
                for (int i = 0; i < anslist.Length; i++)
                {
                    if (anslist[i] == null)
                    {
                        anslist[i] = arrDts[3];
                        break;
                    }
                }
                ans = arrDts[3];
                foreach (string str in arrDts)
                {
                    sendDt += arrDts[x] + '\x01';
                    x++;
                }
                byte[] sendBt = Encoding.UTF8.GetBytes(sendDt);
                for (int j = cnt + 5; j >= 6; j--)
                {
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        if (arrDts[j].Equals(connectedClients[i].RemoteEndPoint.ToString()))
                        {
                            Socket socket = connectedClients[i];
                            try { socket.Send(sendBt); }
                            catch
                            {
                                try { socket.Dispose(); } catch { }
                                connectedClients.RemoveAt(i);
                            }
                            break;
                        }
                    }
                }
            }
            else if (arrDts[0] == "9") // 클라이언트 리스트 갱신
            {
                this.Invoke(new MethodInvoker(delegate()
                {
                    for (int i = ClientList.Items.Count - 1; i >= 0; i--)
                    {
                        if (ClientList.Items[i].ToString().Equals(arrDts[1]))
                        {
                            ClientList.Items.Remove(ClientList.Items[i]);
                            connectedClients.Remove(connectedClients[i]);
                            break;
                        }
                    }
                    string iptext = "9" + '\x01';
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        iptext += connectedClients[i].RemoteEndPoint.ToString() + '\x01';
                    }
                    byte[] lbip = Encoding.UTF8.GetBytes(iptext);
                    for (int i = connectedClients.Count - 1; i >= 0; i--)
                    {
                        Socket socket = connectedClients[i];
                        try { socket.Send(lbip); }
                        catch
                        {
                            try { socket.Dispose(); } catch { }
                            connectedClients.RemoveAt(i);
                        }
                    }
                }));
                obj.WorkingSocket.Close();
                return;
            }
            obj.ClearBuffer();
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj);
        }
Ejemplo n.º 12
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                // AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum));
                if (clientNum > 0)
                {
                    foreach (KeyValuePair <string, Socket> clients in connectedClients)
                    {
                        if (obj.WorkingSocket == clients.Value)
                        {
                            string key       = clients.Key;
                            string clientIDs = "";
                            try
                            {
                                client_ID.RemoveAt(client_ID.IndexOf(key));
                                listView1.Clear();
                                for (int i = 0; i < client_ID.Count; i++)
                                {
                                    listView1.Items.Add(client_ID[i]);
                                    clientIDs += client_ID[i];
                                    clientIDs += ":";
                                }
                                connectedClients.Remove(key);
                                AppendText(txtHistory, string.Format("접속해제완료:{0}", key));
                                byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs);
                                sendAll(null, bDts);
                            }
                            catch { }
                            break;
                        }
                    }
                }
                obj.WorkingSocket.Disconnect(false);
                obj.WorkingSocket.Close();
                clientNum--; //참여자
                             // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum));
                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            AppendText(txtHistory, text);

            // : 기준으로 짜른다.
            string[] tokens = text.Split(':');
            string   fromID = null;
            string   toID   = null;
            string   code   = tokens[0];

            if (code.Equals("ID"))                      // 받은 문자열   id:자신의 id
            {
                fromID = tokens[1].Trim();              //fromID;
                if (client_ID.Contains(fromID) == true) //이미 등록된 아이디면 (1) (2)로 출력되게 끔
                {
                    if (client_ID.Contains(fromID + "(2)") == true)
                    {
                        fromID += "(3)";
                    }
                    else
                    {
                        fromID += "(2)";
                    }
                }
                clientNum++; //참여자
                //listView1.Items.Add(fromID);//참여자 목록
                AppendListText(listView1, "시발");
                AppendText(txtHistory, string.Format("[접속{0}]ID:{1}:{2}",
                                                     clientNum, fromID, obj.WorkingSocket.RemoteEndPoint.ToString()));

                // 연결된 클라이언트 리스트에 추가해준다.
                connectedClients.Add(fromID, obj.WorkingSocket);
                // 전체 클라이언트에게 데이터를 보낸다.
                sendAll(obj.WorkingSocket, obj.Buffer);

                if (clientNum > 0)
                { //참여자 목록
                    client_ID.Add(fromID);
                    string clientIDs = "";
                    for (int i = 0; i < client_ID.Count; i++)
                    {
                        clientIDs += client_ID[i];
                        clientIDs += ":";
                    }
                    //접속을 1명했다면 clientName : clientNum : 1 :;
                    //접속을 2명했다면 clientName : clientNum : 1 : 2 :;
                    byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs);
                    sendAll(null, bDts);
                }

                if (clientNum == 3 && card_send == 0) // 3명 접속하면 시작
                {
                    card_mix();
                    string card_list = "";
                    for (int i = 0; i < card_number_list.Count; i++)
                    {
                        card_list += card_number_list[i];
                        card_list += ":"; // : 단위로 분할
                    }
                    AppendText(txtHistory, card_list);
                    // AppendText(txtHistory, string.Format("Card" + ':' + card_list));
                    byte[] bDtss = Encoding.UTF8.GetBytes("Card" + ':' + card_list);
                    sendAll(obj.WorkingSocket, bDtss);
                    card_send++;//한번만 보내주기 위해
                }
            }

            else if (code.Equals("BR"))
            {
                fromID = tokens[1].Trim(); //fromID
                string msg = tokens[2];
                AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg));
                sendAll(obj.WorkingSocket, obj.Buffer);
            }

            else if (code.Equals("TO"))    // TO:to_id:message
            {
                fromID = tokens[1].Trim(); //fromID
                toID   = tokens[2].Trim();
                string msg        = tokens[3];
                string sendingMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg;
                AppendText(txtHistory, sendingMsg);
                connectedClients.TryGetValue(toID, out obj.WorkingSocket);
                sendTo(obj.WorkingSocket, obj.Buffer);
                //AppendText(txtHistory, "To socket" + socket.RemoteEndPoint.ToString());
            }
            else
            {
            }



            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();
            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Ejemplo n.º 13
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                // AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum));
                if (clientNum > 0)
                {
                    foreach (KeyValuePair <string, Socket> clients in connectedClients)
                    {
                        if (obj.WorkingSocket == clients.Value)
                        {
                            string key       = clients.Key;
                            string clientIDs = "";
                            try
                            {
                                client_ID.RemoveAt(client_ID.IndexOf(key));
                                this.Invoke(new Action(delegate()
                                {
                                    listView1.Clear(); //리스트뷰 clear
                                }));
                                for (int i = 0; i < client_ID.Count; i++)
                                {
                                    this.Invoke(new Action(delegate()
                                    {
                                        listView1.Items.Add(client_ID[i]); //서버에 접속한 클라이언트 추가
                                    }));
                                    clientIDs += client_ID[i];
                                    clientIDs += ":";
                                }
                                connectedClients.Remove(key);
                                AppendText(txtHistory, string.Format("접속해제완료:{0}", key));
                                clientNum--;
                                byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs);
                                sendAll(null, bDts);
                            }
                            catch { }
                            break;
                        }
                    }
                }
                try
                {
                    obj.WorkingSocket.Disconnect(false);
                }
                catch { }
                obj.WorkingSocket.Disconnect(false);
                obj.WorkingSocket.Close();
                // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum));
                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            // : 기준으로 짜른다.
            string[] tokens = text.Split(':');
            string   fromID = null;
            string   toID   = null;
            string   code   = tokens[0];

            if (code.Equals("ID"))                      // 받은 문자열   id:자신의 id
            {
                fromID = tokens[1].Trim();              //fromID;
                if (client_ID.Contains(fromID) == true) //같은 아이디 접속
                {
                    if (client_ID.Contains(fromID + "(2)") == true)
                    {
                        fromID += "(3)";
                    }
                    else
                    {
                        fromID += "(2)";
                    }
                }

                clientNum++;     //참여자
                this.Invoke(new Action(delegate()
                {
                    this.Invoke(new Action(delegate()
                    {
                        listView1.Items.Add(fromID);//참여자 목록
                    }));
                }));

                AppendText(txtHistory, string.Format("[접속{0}]ID:{1}:{2}",
                                                     clientNum, fromID, obj.WorkingSocket.RemoteEndPoint.ToString()));

                // 연결된 클라이언트 리스트에 추가해준다.
                connectedClients.Add(fromID, obj.WorkingSocket);
                // 전체 클라이언트에게 데이터를 보낸다.
                sendAll(obj.WorkingSocket, obj.Buffer);

                if (clientNum > 0)
                {     //참여자 목록
                    client_ID.Add(fromID);
                    string clientIDs = "";
                    for (int i = 0; i < client_ID.Count; i++)
                    {
                        clientIDs += client_ID[i];
                        clientIDs += ":";
                    }
                    //접속을 1명했다면 clientName : clientNum : 1 :;
                    //접속을 2명했다면 clientName : clientNum : 1 : 2 :;
                    byte[] bDts = Encoding.UTF8.GetBytes("ClientName" + ':' + clientNum + ":" + clientIDs);
                    sendAll(null, bDts);
                }

                if (clientNum == 3 && card_send == 0)     // 3명 접속하면 시작
                {
                    card_mix();
                    //esc_count = 0;
                    string card_list = "";
                    for (int i = 0; i < card_number_list.Count; i++)
                    {
                        card_list += card_number_list[i];
                        card_list += ":";
                    }
                    AppendText(txtHistory, card_list);
                    byte[] bDtss = Encoding.UTF8.GetBytes("Card" + ':' + card_list);
                    sendAll(null, bDtss);
                    card_send++;    //한번만 보내주기 위해
                }
            }

            //전체 메시지
            else if (code.Equals("BR"))
            {
                fromID = tokens[1].Trim(); //fromID
                string msg = tokens[2];
                AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg));
                sendAll(obj.WorkingSocket, obj.Buffer);
            }

            //귓속말
            else if (code.Equals("TO"))    // TO:to_id:message
            {
                fromID = tokens[1].Trim(); //fromID
                toID   = tokens[2].Trim();
                string msg        = tokens[3];
                string sendingMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg;
                AppendText(txtHistory, sendingMsg);
                connectedClients.TryGetValue(toID, out obj.WorkingSocket);
                sendTo(obj.WorkingSocket, obj.Buffer);
                //AppendText(txtHistory, "To socket" + socket.RemoteEndPoint.ToString());
            }

            else
            {
            }

            //Client가 답을 보냈을 때
            //Client가 답을 썼을 때 맞는지 틀렸는지 비교
            if (code.Equals("PRE"))
            {
                fromID = tokens[1].Trim(); //fromID

                if (card_number_list[Int32.Parse(tokens[2]) - 1] == card_number_list[Int32.Parse(tokens[3]) - 1])
                {
                    button_color_change_O(Int32.Parse(tokens[2]));
                    button_color_change_O(Int32.Parse(tokens[3]));
                    card_OX_list.Add(Int32.Parse(tokens[2]));
                    card_OX_list.Add(Int32.Parse(tokens[3]));
                    byte[] bDtss = Encoding.UTF8.GetBytes("PREO" + ":" + fromID + ":" + tokens[2] + ":" + tokens[3]);
                    sendAll(null, bDtss);
                }
                else
                {
                    button_color_change_X(Int32.Parse(tokens[2]));
                    button_color_change_X(Int32.Parse(tokens[3]));
                    byte[] bDtss = Encoding.UTF8.GetBytes("PREX" + ":" + fromID + ":" + tokens[2] + ":" + tokens[3]);
                    sendAll(null, bDtss);
                }
            }

            //게임 종료
            if (code.Equals("ESC"))
            {
                if (gameover == 1)
                {
                    byte[] bDtss = Encoding.UTF8.GetBytes("ESC" + ":" + "게임종료");
                    sendAll(null, bDtss);
                    client_ID.Clear();
                    connectedClients.Clear();
                    for (int i = 1; i < 17; i++)
                    {
                        button_color_change_X(i);
                    }
                    clientNum = 0;
                    card_send = 0;
                    card_OX_list.Clear();

                    this.Invoke(new Action(delegate()
                    {
                        listView1.Clear();
                    }));
                    gameover++;
                }
            }

            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();
            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
Ejemplo n.º 14
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                // AppendText(txtHistory, string.Format("클라이언트 접속해제?{0}", clientNum));
                if (clientNum > 0)
                {
                    foreach (KeyValuePair <string, Socket> clients in connectedClients)
                    {
                        if (obj.WorkingSocket == clients.Value)
                        {
                            string key = clients.Key;
                            try
                            {
                                listView1.Items.RemoveByKey(key);
                                connectedClients.Remove(key);
                                AppendText(txtHistory, string.Format("접속해제완료:{0}", key));
                            }catch { }
                            break;
                        }
                    }
                }
                obj.WorkingSocket.Disconnect(false);
                obj.WorkingSocket.Close();
                clientNum--;
                // AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum));
                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            AppendText(txtHistory, text);

            // : 기준으로 짜른다.
            string[] tokens = text.Split(':');
            string   fromID = null;
            string   toID   = null;
            string   code   = tokens[0];

            if (code.Equals("ID"))    // 받은 문자열   id:자신의 id
            {
                clientNum++;
                fromID = tokens[1].Trim();   //fromID;
                listView1.Items.Add(fromID); //참여자 목록

                AppendText(txtHistory, string.Format("[접속{0}]ID:{1}:{2}",
                                                     clientNum, fromID, obj.WorkingSocket.RemoteEndPoint.ToString()));
                // 연결된 클라이언트 리스트에 추가해준다.
                connectedClients.Add(fromID, obj.WorkingSocket);
                // 전체 클라이언트에게 데이터를 보낸다.
                sendAll(obj.WorkingSocket, obj.Buffer);
            }

            else if (code.Equals("BR"))
            {
                fromID = tokens[1].Trim(); //fromID
                string msg = tokens[2];
                AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg));
                sendAll(obj.WorkingSocket, obj.Buffer);
            }

            else if (code.Equals("TO"))    // TO:to_id:message
            {
                fromID = tokens[1].Trim(); //fromID
                toID   = tokens[2].Trim();
                string msg        = tokens[3];
                string sendingMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg;
                AppendText(txtHistory, sendingMsg);
                connectedClients.TryGetValue(toID, out obj.WorkingSocket);
                sendTo(obj.WorkingSocket, obj.Buffer);
                //AppendText(txtHistory, "To socket" + socket.RemoteEndPoint.ToString());
            }
            else
            {
            }


            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            // AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();
            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;


            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                AppendText(txtHistory, string.Format("{0}님이 방을 나갔습니다.", id));

                if (clientNum > 0)
                {
                    foreach (KeyValuePair <string, Socket> clients in connectedClients)
                    {
                        if (obj.WorkingSocket == clients.Value)
                        {
                            string key = clients.Key;
                            try
                            {
                                connectedClients.Remove(key);
                            }
                            catch
                            {
                            }
                            // break;
                        }
                    }
                }
                obj.WorkingSocket.Disconnect(true);
                obj.WorkingSocket.Close();
                clientNum--;
                //AppendText(txtHistory, string.Format("클라이언트 접속해제완료{0}", clientNum));

                return;
            }

            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            //AppendText(txtHistory, text); //받은 메시지를 출력함.

            // : 기준으로 짜른다.
            // tokens[0] - 보낸 사람 ID
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split(':');
            if (tokens[0].Equals("id"))
            {
                clientNum++;
                id = tokens[1];
                AppendText(txtHistory, string.Format("[접속]ID : {0}님이 접속하였습니다", id));


                // 연결된 클라이언트 리스트에 추가해준다.
                connectedClients.Add(id, obj.WorkingSocket);
            }

            else
            {
                id         = tokens[0];
                msg        = tokens[1];
                received_x = tokens[2]; //x좌표를 받는다
                received_y = tokens[3]; //y좌표를 받는다

                AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
                Console.WriteLine(tokens[0]);
                Console.WriteLine(tokens[1]);
                Console.WriteLine(tokens[2]);
                Console.WriteLine(tokens[3]);
                AppendText(txtHistory, string.Format("[받음]{0}: x좌표{1}, y좌표{2}", id, received_x, received_y));
            }
            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.

            // 전체 클라이언트에게 데이터를 보낸다.
            sendAll(obj.WorkingSocket, obj.Buffer);

            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();
            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }