コード例 #1
0
        void OnConnectToServer(object sender, EventArgs e)
        {
            if (mainSock.Connected)
            {
                MsgBoxHelper.Error("이미 연결되어 있습니다!");
                return;
            }

            int port;

            if (!int.TryParse(txtPort.Text, out port))
            {
                MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다.");
                txtPort.Focus();
                txtPort.SelectAll();
                return;
            }

            try { mainSock.Connect(txtAddress.Text, port); }
            catch (Exception ex) {
                MsgBoxHelper.Error("연결에 실패했습니다!\n오류 내용: {0}", MessageBoxButtons.OK, ex.Message);
                return;
            }

            // 연결 완료되었다는 메세지를 띄워준다.
            AppendText(txtHistory, "서버와 연결되었습니다.");

            // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다.
            AsyncObject obj = new AsyncObject(4096);

            obj.WorkingSocket = mainSock;
            mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj);
        }
コード例 #2
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

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

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

                // 텍스트로 변환한다.
                string text = Encoding.UTF8.GetString(obj.Buffer);
                Console.WriteLine(text);
                string[] ok = text.Split('=');
                ok[0] += "==";
                string hi = Decrypt256(ok[0], key);
                Console.WriteLine(hi);
                DataForm data = new DataForm();
                data = JsonConvert.DeserializeObject <DataForm>(hi);
                // : 기준으로 짜른다.
                // tokens[0] - 보낸 사람 ID
                // tokens[1] - 보낸 메세지

                // 텍스트박스에 추가해준다.
                // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
                // 따라서 대리자를 통해 처리한다.
                if (data.id.Equals("Server"))
                {
                    AppendText(txtHistory, string.Format("[공지사항이 등록되었습니다.] : {0}", data.text));
                    this.Invoke(new Action(delegate()
                    {
                        notificationBox.Text = data.text;
                    }));
                    // AppendNoti(notificationBox, data.text);
                }
                else
                {
                    AppendText(txtHistory, string.Format("[받음]{0} : {1}", data.id, data.text));
                }


                // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
                // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
                obj.ClearBuffer();

                // 수신 대기
                obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
            } catch
            {
            }
        }
コード例 #3
0
ファイル: ChatForm2.cs プロジェクト: HyunJungChoe/NW_Project
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

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

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

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

            // : 기준으로 짜른다.
            // tokens[0] - 보낸 사람 ID
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split(':');
            if (tokens[0].Equals("id"))
            {// 새로 접속한 클라이언트가가 "id:자신의_ID" 전송함
                string id = tokens[1];
                AppendText(txtHistory, string.Format("[접속] ID : {0}", id));
            }
            if (tokens[0].Equals("JUM"))
            {
                string jum_id       = tokens[1];
                string jum          = tokens[2];
                string jum_listview = jum_id + ":" + jum;
                listView1.Items.Add(jum_listview);
            }
            else
            {
                string id  = tokens[0];
                string msg = tokens[1];
                AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
            }
            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.


            // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
コード例 #4
0
ファイル: Client.cs プロジェクト: E-nan/TCP-IP
 // 중복 체크
 private void Overlap_Check(object sender, EventArgs e)
 {
     if (!ServerConnected)
     {
         int port = 15000;
         try
         {
             mainSock.Connect(txtServerIP.Text, port);
             ServerConnected = true;
             AsyncObject obj = new AsyncObject(50000);
             obj.WorkingSocket = mainSock;
             mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj);
         }
         catch (Exception ex)
         {
             MsgBoxHelper.Error("연결에 실패했습니다!\n오류 내용: {0}", MessageBoxButtons.OK, ex.Message);
             return;
         }
     }
     byte[] bDts = Encoding.UTF8.GetBytes("7" + '\x01' + mainSock.LocalEndPoint.ToString() + '\x01' + txtNick.Text + '\x01');
     mainSock.Send(bDts);
 }
コード例 #5
0
ファイル: ChatForm2.cs プロジェクト: HyunJungChoe/NW_Project
        private void OnConnectToServer(object sender, EventArgs e)
        {
            if (mainSock.Connected)
            {
                MsgBoxHelper.Error("이미 연결되어 있습니다!");
                return;
            }

            int port = 15000;           //고정

            nameID = txtID.Text.Trim(); //ID
            if (string.IsNullOrEmpty(nameID))
            {
                MsgBoxHelper.Warn("ID가 입력되지 않았습니다!");
                txtID.Focus();
                return;
            }

            // 서버에 연결
            try
            {
                mainSock.Connect(txtAddress.Text, port);
            }
            catch (Exception ex)
            {
                MsgBoxHelper.Error("연결에 실패했습니다!\n오류 내용: {0}", MessageBoxButtons.OK, ex.Message);
                return;
            }

            // 서버로 ID 전송
            SendID();

            // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다.
            AsyncObject obj = new AsyncObject(4096);

            obj.WorkingSocket = mainSock;
            mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj);
        }
コード例 #6
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));

            // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
コード例 #7
0
        void broadcastPing(object ip)
        {
            IPAddress ipArray = (IPAddress)ip;

            Console.WriteLine("파라미터 아이피 보여줘 : " + ipArray);

            int recv = 0;

            byte[] data = new byte[1024];
            string input, stringData;

            IPEndPoint serverEP = new IPEndPoint(ipArray, 15001);

            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            IPEndPoint sender   = new IPEndPoint(IPAddress.Any, 0);
            EndPoint   remoteEP = (EndPoint)sender;

            string welcome = "hello, udp server?";

            data = Encoding.UTF8.GetBytes(welcome);
            client.SendTo(data, data.Length, SocketFlags.None, serverEP);
            data = new byte[1024];
            recv = client.ReceiveFrom(data, ref remoteEP);
            //recv = client.ReceiveFrom(data, ref remoteEP);
            Console.WriteLine("왜 이런거야 " + recv);


            Console.WriteLine("[first] Message received from {0}", remoteEP.ToString());
            if (remoteEP != null)
            {
                //txtAddress.Text = ipArray.ToString();
                AppendText(txtAddress, ipArray.ToString());
                nameID          = ipArray.ToString();
                serverIPAddress = ipArray;
                Console.WriteLine("서버의 ip 주소 : " + ipArray + "port : " + port);
                mainSock.Connect(ipArray, port);
                // 연결 완료되었다는 메세지를 띄워준다.
                AppendText(txtHistory, "서버와 연결되었습니다.");

                // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다.
                AsyncObject obj = new AsyncObject(4096);
                obj.WorkingSocket = mainSock;
                //obj.WorkingSocket = udpSock;
                mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj);
                stringData = Encoding.UTF8.GetString(data, 0, recv);
                Console.WriteLine("데이터 길이 : " + recv);
                Console.WriteLine(stringData);

                string decryptedData = Decrypt256(stringData, key);

                Console.WriteLine(decryptedData);
                // 텍스트로 변환한다.

                DataForm data3 = new DataForm();
                data3 = JsonConvert.DeserializeObject <DataForm>(decryptedData);
                Console.WriteLine(data3.id + " " + data3.text);
                if (data3.text.Length > 0)
                {
                    try
                    {
                        this.Invoke(new Action(delegate()
                        {
                            notificationBox.Text = data3.text;
                        }));
                    }
                    catch
                    {
                    }
                }
                return;
            }
            stringData = Encoding.UTF8.GetString(data, 0, recv);



            Console.WriteLine(stringData);

            Console.WriteLine("Stopping client");
            client.Close();

            Thread th = new Thread(broadcastPing);

            th.IsBackground = true;
            th.Start(broadcastIPAddresses);
        }
コード例 #8
0
        void OnConnectToServer(object sender, EventArgs e)
        {
            // 연결 버튼

            if (btnConnect.Text.Equals("연결끊기"))
            {
                // 문자열을 utf8 형식의 바이트로 변환한다.
                DataForm dataForm = new DataForm();
                dataForm.id   = nameID;
                dataForm.req  = "close";
                dataForm.text = "연결을 종료합니다.";
                string request = JsonConvert.SerializeObject(dataForm);
                byte[] bDts    = Encoding.UTF8.GetBytes(request);
                // Encoding.UTF8.GetBytes(nameID + '`' + tts);


                // 서버에 전송한다.
                mainSock.Send(bDts);

                // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다.
                AppendText(txtHistory, string.Format("[연결을 종료합니다.]"));

                mainSock        = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                btnConnect.Text = "연결";
                return;
            }
            if (mainSock.Connected)
            {
                MsgBoxHelper.Error("이미 연결되어 있습니다!");
                return;
            }



            if (txtID.Text.Length <= 0)
            {
                MsgBoxHelper.Error("아이디를 입력해주세요");
            }
            nameID = txtID.Text; //ID

            AppendText(txtHistory, string.Format("서버: @{0}, port: @{1}, ID: @{2}", txtAddress.Text, port, nameID));
            try
            {
                // 여기서 브로드 캐스트 한번 해줘야 함
                mainSock.Connect(serverIPAddress, port);
                // 밑에는 원래 코드
                // mainSock.Connect(broadcastIPAddresses[192], port);
                //Console.WriteLine("이거 보이면 연결 잘 된겨 브로드 캐스트 아이피 뽑기 : "+broadcastIPAddress  + i);
            }
            catch (Exception ex)
            {
                Console.WriteLine("연결 실패 ");
                MsgBoxHelper.Error("연결에 실패했습니다!\n오류 내용: {0}", MessageBoxButtons.OK, ex.Message);
            }
            // 연결 완료되었다는 메세지를 띄워준다.
            AppendText(txtHistory, "서버와 연결되었습니다.");

            // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다.
            AsyncObject obj = new AsyncObject(4096);

            obj.WorkingSocket = mainSock;
            mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj);
        }
コード例 #9
0
ファイル: Client.cs プロジェクト: E-nan/TCP-IP
        // 데이터 수신 함수
        void DataReceived(IAsyncResult ar)
        {
            AsyncObject obj  = (AsyncObject)ar.AsyncState;
            string      text = Encoding.UTF8.GetString(obj.Buffer);

            string[] arrDts = text.Split('\x01');
            this.Invoke(new MethodInvoker(delegate()
            {
                if (arrDts[0] == "1") // 전체 채팅
                {
                    AppendText(txtHistory, string.Format("[받음]{0}: {1}", arrDts[1], arrDts[2]));
                }
                else if (arrDts[0] == "2") // 그림방 채팅
                {
                    foreach (Form OpenForm in Application.OpenForms)
                    {
                        if (OpenForm.Text == "Drawing Catch ( " + crenick + " )")
                        {
                            pg.recvChat = text;
                            return;
                        }
                    }
                    pg     = new Paint_Game(this, Nick_label.Text);
                    recvDt = text;
                    pg.Show();
                }
                else if (arrDts[0] == "3") // 그림 받기
                {
                    int cnt = int.Parse(arrDts[3]);
                    foreach (Form OpenForm in Application.OpenForms)
                    {
                        if (OpenForm.Text == "Drawing Catch ( " + crenick + " )")
                        {
                            Byte[] Img       = Convert.FromBase64String(arrDts[2]);
                            TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
                            Bitmap Imgbit    = (Bitmap)tc.ConvertFrom(Img);
                            pg.recvPicture   = Imgbit;
                            return;
                        }
                    }
                    pg = new Paint_Game(this, Nick_label.Text);
                    pg.Show();
                }
                else if (arrDts[0] == "4")// ******************************************************************************************배열 1씩 더하ㅡㄴ중
                {
                    int cnt = int.Parse(arrDts[4]);
                    foreach (Form OpenForm in Application.OpenForms)
                    {
                        if (OpenForm.Text == "Drawing Catch ( " + crenick + " )")
                        {
                            if (arrDts[5] == "1" || arrDts[5] == "2")
                            {
                                pg.recvState = text;
                                return;
                            }
                            else
                            {
                                pg.recvStart = text;
                                return;
                            }
                        }
                    }
                    pg     = new Paint_Game(this, Nick_label.Text);
                    recvDt = text;
                    pg.Show();
                }
                else if (arrDts[0] == "5")
                {
                    int cnt = int.Parse(arrDts[5]);
                    foreach (Form OpenForm in Application.OpenForms)
                    {
                        if (OpenForm.Text == "Drawing Catch ( " + crenick + " )")
                        {
                            pg.recvCollect = text;
                            return;
                        }
                    }
                    pg     = new Paint_Game(this, mainSock.LocalEndPoint.ToString());
                    recvDt = text;
                    pg.Show();
                }
                else if (arrDts[0] == "6")
                {
                    int cnt = int.Parse(arrDts[5]);
                    foreach (Form OpenForm in Application.OpenForms)
                    {
                        if (OpenForm.Text == "Drawing Catch ( " + crenick + " )")
                        {
                            pg.recvEnd = text;
                            return;
                        }
                    }
                    pg     = new Paint_Game(this, Nick_label.Text);
                    recvDt = text;
                    pg.Show();
                }
                else if (arrDts[0] == "7")
                {
                    if (arrDts[1] == "1")
                    {
                        MessageBox.Show("사용 가능한 닉네임입니다!");
                        button2.Enabled = false;
                    }
                    else
                    {
                        MessageBox.Show("이미 사용중인 닉네임입니다!");
                    }
                }
                else if (arrDts[0] == "8") // 참여
                {
                    ClientList.Items.Clear();
                    for (int i = 2; i < arrDts.Length - 1; i++)
                    {
                        ClientList.Items.Add(arrDts[i]);
                    }
                    AppendText(txtHistory, string.Format("{0}", arrDts[1]));
                }
                else if (arrDts[0] == "9") // 퇴장
                {
                    ClientList.Items.Clear();
                    for (int i = 2; i < arrDts.Length - 1; i++)
                    {
                        ClientList.Items.Add(arrDts[i]);
                    }
                    AppendText(txtHistory, string.Format("{0}", arrDts[1]));
                }
                else if (arrDts[0] == "0") // 서버 종료
                {
                    mainSock.Disconnect(true);
                    ClientList.Items.Clear();
                    AppendText(txtHistory, string.Format("서버와의 연결이 종료되었습니다."));
                    ServerConnected = false;
                    obj.ClearBuffer();
                    mainSock.Close();
                    mainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                    return;
                }
            }));
            obj.ClearBuffer();
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 50000, 0, DataReceived, obj);
        }
コード例 #10
0
ファイル: ChatForm.cs プロジェクト: BCSJH/C-language
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

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

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

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

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

            if (tokens[0].Equals("ID"))
            {// 새로 접속한 클라이언트가 "id:자신의_ID" 전송함
                string id = tokens[1];
                check_name.Add(id);

                AppendText(txtHistory, string.Format("[접속] ID: {0}", id));
            }
            else if (tokens[0].Equals("Server"))
            {
                string msg = tokens[1];
                AppendText(txtHistory, string.Format("[공지]: {0}", msg));

                string clientNumber = tokens[3];
                AppendText(txtHistory, string.Format("[참여자]: {0}", clientNumber));
            }
            else if (tokens[0].Equals("BR"))
            {
                string fromID = tokens[1];
                string msg    = tokens[2];
                AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg));
            }
            else if (tokens[0].Equals("TO"))
            {
                string fromID      = tokens[1];
                string toID        = tokens[2];
                string msg         = tokens[3];
                string receivedMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg;
                AppendText(txtHistory, receivedMsg);
            }

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


            // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
コード例 #11
0
ファイル: ChatForm.cs プロジェクト: BCSJH/C-language
        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;
                }
            }
            catch { }

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.


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

            // : 기준으로 짜른다.
            // tokens[0] - 보낸 사람 ID
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split(':');
            if (tokens[0].Equals("ID"))
            {// 새로 접속한 클라이언트가 "id:자신의_ID" 전송함
                string id = tokens[1];
                check_name.Add(id);
                AppendText(txtHistory, string.Format("[접속] ID: {0}", id));
            }
            else if (tokens[0].Equals("Server"))
            {
                string msg = tokens[1];
                AppendText(txtHistory, string.Format("[공지]: {0}", msg));
            }
            else if (tokens[0].Equals("BR"))
            {
                string fromID = tokens[1];
                string msg    = tokens[2];
                AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg));
            }
            else if (tokens[0].Equals("TO"))
            {
                string fromID      = tokens[1];
                string toID        = tokens[2];
                string msg         = tokens[3];
                string receivedMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg;
                AppendText(txtHistory, receivedMsg);
            }

            //접속을 1명했다면 clientName : 1 : 1 :;
            //접속을 2명했다면 clientName : 2 : 1 : 2 :;

            if (tokens[0].Equals("PREO"))
            {
                string fromID = tokens[1];
                AppendText(txtHistory, string.Format("[정답]{0}:{1}:{2}", fromID, tokens[2], tokens[3]));
                button_color_change_O(Int32.Parse(tokens[2])); card_check.Add(Int32.Parse(tokens[2]));
                button_color_change_O(Int32.Parse(tokens[3])); card_check.Add(Int32.Parse(tokens[3]));
                if (card_check.Count == 16)
                {
                    byte[] bDts = Encoding.UTF8.GetBytes("ESC:");
                    mainSock.Send(bDts);
                }
            }
            if (tokens[0].Equals("PREX"))
            {
                string fromID = tokens[1];
                AppendText(txtHistory, string.Format("[오답]{0}:{1}:{2}", fromID, tokens[2], tokens[3]));
                button_color_change_X(Int32.Parse(tokens[2]));
                button_color_change_X(Int32.Parse(tokens[3]));
            }

            if (tokens[0].Equals("ClientName"))//listView에 추가하기
            {
                this.Invoke(new Action(delegate()
                {
                    listView1.Clear();
                    comboBox1.Items.Clear();
                    comboBox1.Items.Add("BR");
                }));
                clientNum = int.Parse(tokens[1]);//접속한 인원 수
                for (int i = 0; i < clientNum; i++)
                {
                    string clientName = tokens[2 + i];
                    this.Invoke(new Action(delegate()
                    {
                        listView1.Items.Add(clientName);
                    }));
                    this.Invoke(new Action(delegate()
                    {
                        comboBox1.Items.Add(clientName);
                    }));
                }
                this.Invoke(new Action(delegate()
                {
                    comboBox1.SelectedIndex = 0;
                }));
            }
            if (tokens[0].Equals("Card"))                //listView에 추가하기
            {
                for (int i = 0; i < 16; i++)             //(1~7까의 수 * 2) 14개
                {
                    int card = int.Parse(tokens[i + 1]); //카드 값
                    card_list.Add(card);
                }
                this.Invoke(new Action(delegate()
                {
                    button1.Text  = "" + card_list[0];
                    button2.Text  = "" + card_list[1];
                    button3.Text  = "" + card_list[2];
                    button4.Text  = "" + card_list[3];
                    button5.Text  = "" + card_list[4];
                    button6.Text  = "" + card_list[5];
                    button7.Text  = "" + card_list[6];
                    button8.Text  = "" + card_list[7];
                    button9.Text  = "" + card_list[8];
                    button10.Text = "" + card_list[9];
                    button11.Text = "" + card_list[10];
                    button12.Text = "" + card_list[11];
                    button13.Text = "" + card_list[12];
                    button14.Text = "" + card_list[13];
                    button15.Text = "" + card_list[14];
                    button16.Text = "" + card_list[15];
                }));
                Thread.Sleep(5000);
                this.Invoke(new Action(delegate()
                {
                    button1.Text  = "1";
                    button2.Text  = "2";
                    button3.Text  = "3";
                    button4.Text  = "4";
                    button5.Text  = "5";
                    button6.Text  = "6";
                    button7.Text  = "7";
                    button8.Text  = "8";
                    button9.Text  = "9";
                    button10.Text = "10";
                    button11.Text = "11";
                    button12.Text = "12";
                    button13.Text = "13";
                    button14.Text = "14";
                    button15.Text = "15";
                    button16.Text = "16";
                }));
            }
            if (tokens[0].Equals("ESC"))
            {
                AppendText(txtHistory, string.Format("[게임종료]"));
                if (MessageBox.Show("게임을 더 하시겠습니까?", "게임종료", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    //초-기-화
                    check_name.Clear();
                    check_card_number.Clear();
                    card_check.Clear();
                    card_list.Clear();
                    for (int i = 1; i < 17; i++)
                    {
                        button_color_change_X(i);
                    }
                    SendID();
                }
                else
                {
                    Application.Exit();
                }
            }
            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.


            // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }
コード例 #12
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;
            string      con = "님이 접속하였습니다.";

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


                if (received <= 0)
                {
                    AppendText(txtHistory, string.Format("{0}님이 접속 해제하였습니다.", nameID));

                    obj.WorkingSocket.Disconnect(true);
                    obj.WorkingSocket.Close();
                    this.Close();
                    return;
                }
            }
            catch (ObjectDisposedException e)
            {
                Console.WriteLine("에러: " + e);
            }

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.


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

            //byte[] 수신

            // : 기준으로 짜른다.
            // tokens[0] - 보낸 사람 ID
            // tokens[1] - 보낸 메세지
            //tokens[2] - 받은 x좌표 값
            //tokens[3] - 받은 y좌표 값
            string[] tokens = text.Split(':');

            if (tokens[0].Equals("id"))
            {// 새로 접속한 클라이언트가가 "id:자신의_ID" 전송함
                id = tokens[1];
                AppendText(txtHistory, string.Format("'[접속] ID : {0}님이 접속하였습니다.'", id));
            }

            else
            {
                id         = tokens[0];
                msg        = tokens[1]; //인덱스 배열 범위 설정(서버)
                received_x = tokens[2];
                received_y = tokens[3];


                AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
                Console.WriteLine(msg);
                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 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.

            // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
            try
            {
            }
            catch (IndexOutOfRangeException e)
            {
                Console.WriteLine("예외 오류: " + e.Message);
                Console.WriteLine("예외 라인: " + e.StackTrace);
            }
        }
コード例 #13
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;

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

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

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

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

            if (tokens[0].Equals("ID"))
            {// 새로 접속한 클라이언트가 "id:자신의_ID" 전송함
                string id = tokens[1];
                check_name.Add(id);
                AppendText(txtHistory, string.Format("[접속] ID: {0}", id));
            }
            else if (tokens[0].Equals("Server"))
            {
                string msg = tokens[1];
                AppendText(txtHistory, string.Format("[공지]: {0}", msg));
            }
            else if (tokens[0].Equals("BR"))
            {
                string fromID = tokens[1];
                string msg    = tokens[2];
                AppendText(txtHistory, string.Format("[전체]{0}: {1}", fromID, msg));
            }
            else if (tokens[0].Equals("TO"))
            {
                string fromID      = tokens[1];
                string toID        = tokens[2];
                string msg         = tokens[3];
                string receivedMsg = "[FROM:" + fromID + "][TO:" + toID + "]" + msg;
                AppendText(txtHistory, receivedMsg);
            }

            //접속을 1명했다면 clientName : 1 : 1 :;
            //접속을 2명했다면 clientName : 2 : 1 : 2 :;

            if (tokens[0].Equals("ClientName"))//listView에 추가하기
            {
                listView1.Clear();
                comboBox1.Items.Clear();
                comboBox1.Items.Add("BR");
                int clientNum = int.Parse(tokens[1]);//접속한 인원 수
                for (int i = 0; i < clientNum; i++)
                {
                    string clientName = tokens[2 + i];
                    listView1.Items.Add(clientName);
                    comboBox1.Items.Add(clientName);
                }
                comboBox1.SelectedIndex = 0;
            }
            if (tokens[0].Equals("Card"))                //listView에 추가하기
            {
                List <int> card_list = new List <int>(); //카트의 리스트
                for (int i = 0; i < 16; i++)             //(1~7까의 수 * 2) 14개
                {
                    int card = int.Parse(tokens[i + 1]); //카드 값
                    card_list.Add(card);

                    //AppendText(txtHistory, "card : " + tokens[i+1]);
                }

                button1.Text  = "" + card_list[0];
                button2.Text  = "" + card_list[1];
                button3.Text  = "" + card_list[2];
                button4.Text  = "" + card_list[3];
                button5.Text  = "" + card_list[4];
                button6.Text  = "" + card_list[5];
                button7.Text  = "" + card_list[6];
                button8.Text  = "" + card_list[7];
                button9.Text  = "" + card_list[8];
                button10.Text = "" + card_list[9];
                button11.Text = "" + card_list[10];
                button12.Text = "" + card_list[11];
                button13.Text = "" + card_list[12];
                button14.Text = "" + card_list[13];
                button15.Text = "" + card_list[14];
                button16.Text = "" + card_list[15];
                Thread.Sleep(5000);
                button1.Text  = "1";
                button2.Text  = "2";
                button3.Text  = "3";
                button4.Text  = "4";
                button5.Text  = "5";
                button6.Text  = "6";
                button7.Text  = "7";
                button8.Text  = "8";
                button9.Text  = "9";
                button10.Text = "10";
                button11.Text = "11";
                button12.Text = "12";
                button13.Text = "13";
                button14.Text = "14";
                button15.Text = "15";
                button16.Text = "16";
            }
            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.


            // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();

            // 수신 대기
            obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }