Пример #1
0
        void OnConnectToServer(object sender, EventArgs e)
        {
            if (mainSock.Connected)
            {
                MsgBoxHelper.Error("이미 연결되어 있습니다!");
                return;
            }
            int port = 15000;    //고정

            nameID = txtID.Text; //ID
            AppendText(txtHistory, string.Format("서버: @{0},port: 15000, ID: @{1}", txtAddress.Text, nameID));

            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 AcceptCallback(IAsyncResult ar)
        {
            // 클라이언트의 연결 요청을 수락한다.
            clientSokect = mainSock.EndAccept(ar);

            AsyncObject obj = new AsyncObject(4096);

            obj.WorkingSocket = clientSokect;

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


            //클라이언트에게 선공이라고 알림
            byte[] bDts = Encoding.UTF8.GetBytes("3:선공");
            clientSokect.Send(bDts);
            // 클라이언트의 데이터를 받는다.
            clientSokect.BeginReceive(obj.Buffer, 0, 4096, 0,
                                      DataReceived, obj);
        }
Пример #3
0
        void DataReceived(IAsyncResult ar)
        {
            // BeginReceive에서 추가적으로 넘어온 데이터를
            // AsyncObject 형식으로 변환한다.
            AsyncObject obj = (AsyncObject)ar.AsyncState;
            // as AsyncObject로 해도 됨
            // 데이터 수신을 끝낸다.
            int received = obj.WorkingSocket.EndReceive(ar);

            // 받은 데이터가 없으면(연결끊어짐) 끝낸다.
            if (received <= 0)
            {
                obj.WorkingSocket.Disconnect(false);
                obj.WorkingSocket.Close();
                return;
            }
            string id, msg;
            string x, y, stone, Return;
            // 텍스트로 변환한다.
            string text = Encoding.UTF8.GetString(obj.Buffer);

            // : 기준으로 짜른다.
            // tokens[0] - 보낸 사람 ID
            // tokens[1] - 보낸 메세지
            string[] tokens = text.Split(':');
            Console.WriteLine(text);
            if (tokens[0].Equals("0"))
            {
                id  = tokens[1];
                msg = tokens[2];
                AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg));
            }
            else if (tokens[0].Equals("1"))
            {
                Console.WriteLine(text);
                x      = tokens[1];
                y      = tokens[2];
                stone  = tokens[3];
                Return = tokens[4];

                //자신의 턴확인
                if (Return.Equals("myturn"))
                {
                    myturn = true;
                }

                //그림판에 그림그리기
                int x1 = Convert.ToInt32(x);
                int y1 = Convert.ToInt32(y);


                //델리게이트
                Pannel1_Read(x1, y1, stone);
            }
            else if (tokens[0].Equals("3"))
            {
                Console.WriteLine(text);
                myturn = true;
            }
            // 텍스트박스에 추가해준다.
            // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다.
            // 따라서 대리자를 통해 처리한다.
            // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다.
            obj.ClearBuffer();
            // 수신 대기
            obj.WorkingSocket.BeginReceive
                (obj.Buffer, 0, 4096, 0, DataReceived, obj);
        }