Esempio n. 1
0
        private void handleDataSend(IAsyncResult ar)
        {
            // 넘겨진 추가 정보를 가져옵니다.
            AsyncObject ao = (AsyncObject)ar.AsyncState;

            // 보낸 바이트 수를 저장할 변수 선언
            Int32 sentBytes;

            try
            {
                // 자료를 전송하고, 전송한 바이트를 가져옵니다.
                sentBytes = ao.WorkingSocket.EndSend(ar);
            }
            catch (Exception ex)
            {
                // 예외가 발생하면 예외 정보 출력 후 함수를 종료한다.
                Console.WriteLine("자료 송신 도중 오류 발생! 메세지: {0}", ex.Message);
                return;
            }

            if (sentBytes > 0)
            {
                // 여기도 마찬가지로 보낸 바이트 수 만큼 배열 선언 후 복사한다.
                Byte[] msgByte = new Byte[sentBytes];
                Array.Copy(ao.Buffer, msgByte, sentBytes);

                Console.WriteLine("메세지 보냄: {0}", Encoding.Unicode.GetString(msgByte));
            }
        }
Esempio n. 2
0
        // 연결하기 버튼 클릭 시 연결 시작
        private void buttonConnect_Click(object sender, EventArgs e)
        {
            int port;

            if (serverSocket == null)
            {
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            }
            try { port = Int32.Parse(textPort.Text); }
            catch
            {
                MessageBox.Show("포트 번호가 잘못 입력되었습니다.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textPort.Focus();
                textPort.SelectAll();
                return;
            }

            if (serverSocket.Connected)
            {
                MessageBox.Show("이미 연결되어 있습니다.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (port < 0 || port > 65535)
            {
                MessageBox.Show("포트 번호가 잘못 입력되었습니다.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textPort.Focus();
                textPort.SelectAll();
            }
            else if (textNickName.Text == "")
            {
                MessageBox.Show("닉네임을 채워 넣어주세요.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                try { serverSocket.Connect(textAddress.Text, port); }
                catch (SocketException ex)
                {
                    MessageBox.Show("연결에 실패하였습니다. \n오류 내용 : " + ex.Message, "Error",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                byte[] byteData = Encoding.UTF8.GetBytes(textNickName.Text + '\x01' + '\x02');
                serverSocket.Send(byteData);
                textAddress.ReadOnly = true; textPort.ReadOnly = true; textNickName.ReadOnly = true;

                AppendText("서버와 연결되었습니다.");
                AsyncObject asyncObject = new AsyncObject(4096, serverSocket);
                serverSocket.BeginReceive(asyncObject.Buffer, 0, asyncObject.BufferSize, 0, ReceivedData, asyncObject);
            }
        }
Esempio n. 3
0
        //connects to server if possible, otherwise error
        private void BtnConnect_Click(object sender, EventArgs e)
        {
            int port;

            if (serverSocket == null)
            {
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            }
            try { port = Int32.Parse(tbPort.Text); }
            catch
            {
                MessageBox.Show("Port number entered incorrectly.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                tbPort.Focus();
                tbPort.SelectAll();
                return;
            }

            if (serverSocket.Connected)
            {
                MessageBox.Show("Already connected.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (port < 0 || port > 65535)
            {
                MessageBox.Show("Port number entered incorrectly.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                tbPort.Focus();
                tbPort.SelectAll();
            }
            else if (tbUsername.Text == "")
            {
                MessageBox.Show("Please enter a username", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                try { serverSocket.Connect(tbIP.Text, port); }
                catch (SocketException ex)
                {
                    MessageBox.Show("Connection failed.\nerror content: " + ex.Message, "Error",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                byte[] byteData = Encoding.UTF8.GetBytes(tbUsername.Text + '\x01' + '\x02');
                serverSocket.Send(byteData);
                tbIP.ReadOnly = true; tbPort.ReadOnly = true; tbUsername.ReadOnly = true;

                AppendText("Connected with server.");
                AsyncObject asyncObject = new AsyncObject(4096, serverSocket);
                serverSocket.BeginReceive(asyncObject.Buffer, 0, asyncObject.BufferSize, 0, ReceiveData, asyncObject);
            }
        }
Esempio n. 4
0
        // 데이터 받기 Callback
        private void ReceivedData(IAsyncResult asyncResult)
        {
            AsyncObject asyncObject = asyncResult.AsyncState as AsyncObject;

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

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

            string[] tokens = text.Split('\x01');
            try
            {
                if (tokens[1][0] == '\x02')
                {
                    AppendText(tokens[0] + "님이 입장하셨습니다.");
                }
                else if (tokens[1][0] == '\x03')
                {
                    AppendText(tokens[0] + "님이 퇴장하셨습니다.");
                }
                else if (tokens[1][0] == '\x04')
                {
                    try
                    {
                        AppendText("서버 종료로 서버와의 연결이 해제되었습니다.");
                        serverSocket.Close();
                        serverSocket         = null;
                        textAddress.ReadOnly = false; textPort.ReadOnly = false; textNickName.ReadOnly = false;
                    }
                    catch { }
                    return;
                }
                else
                {
                    AppendText("[받음] " + tokens[0] + " : " + tokens[1]);
                }
            }
            catch { }

            asyncObject.ClearBuffer();
            try { asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceivedData, asyncObject); }
            catch { asyncObject.WorkingSocket.Close(); }
        }
Esempio n. 5
0
        //displays data from server
        private void ReceiveData(IAsyncResult asyncResult)
        {
            AsyncObject asyncObject = asyncResult.AsyncState as AsyncObject;

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

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

            string[] tokens = text.Split('\x01');
            try
            {
                if (tokens[1][0] == '\x02')
                {
                    AppendText(tokens[0] + " has joined.");
                }
                else if (tokens[1][0] == '\x03')
                {
                    AppendText(tokens[0] + " has left.");
                }
                else if (tokens[1][0] == '\x04')
                {
                    try
                    {
                        AppendText("The server has been disconnected from the server shutdown.");
                        serverSocket.Close();
                        serverSocket  = null;
                        tbIP.ReadOnly = false; tbPort.ReadOnly = false; tbUsername.ReadOnly = false;
                    }
                    catch { }
                    return;
                }
                else
                {
                    AppendText("[recieved] " + tokens[0] + ": " + tokens[1]);
                }
            }
            catch { }

            asyncObject.ClearBuffer();
            try { asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject); }
            catch { asyncObject.WorkingSocket.Close(); }
        }
Esempio n. 6
0
        private void handleDataReceive(IAsyncResult ar)
        {
            // 넘겨진 추가 정보를 가져옵니다.
            // AsyncState 속성의 자료형은 Object 형식이기 때문에 형 변환이 필요합니다~!
            AsyncObject ao = (AsyncObject)ar.AsyncState;

            // 받은 바이트 수 저장할 변수 선언
            Int32 recvBytes;

            try
            {
                // 자료를 수신하고, 수신받은 바이트를 가져옵니다.
                recvBytes = ao.WorkingSocket.EndReceive(ar);
            }
            catch
            {
                // 예외가 발생하면 함수 종료!
                return;
            }

            // 수신받은 자료의 크기가 1 이상일 때에만 자료 처리
            if (recvBytes > 0)
            {
                // 공백 문자들이 많이 발생할 수 있으므로, 받은 바이트 수 만큼 배열을 선언하고 복사한다.
                Byte[] msgByte = new Byte[recvBytes];
                Array.Copy(ao.Buffer, msgByte, recvBytes);

                // 받은 메세지를 출력
                Console.WriteLine("메세지 받음: {0}", Encoding.Unicode.GetString(msgByte));
            }

            try
            {
                // 자료 처리가 끝났으면~
                // 이제 다시 데이터를 수신받기 위해서 수신 대기를 해야 합니다.
                // Begin~~ 메서드를 이용해 비동기적으로 작업을 대기했다면
                // 반드시 대리자 함수에서 End~~ 메서드를 이용해 비동기 작업이 끝났다고 알려줘야 합니다!
                ao.WorkingSocket.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao);
            }
            catch (Exception ex)
            {
                // 예외가 발생하면 예외 정보 출력 후 함수를 종료한다.
                Console.WriteLine("자료 수신 대기 도중 오류 발생! 메세지: {0}", ex.Message);
                return;
            }
        }
Esempio n. 7
0
        public void ConnectToServer(String hostName, UInt16 hostPort)
        {
            // TCP 통신을 위한 소켓을 생성합니다.
            m_ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

            Boolean isConnected = false;

            try
            {
                // 연결 시도
                m_ClientSocket.Connect(hostName, hostPort);

                // 연결 성공
                isConnected = true;
            }
            catch
            {
                // 연결 실패 (연결 도중 오류가 발생함)
                isConnected = false;
            }
            g_Connected = isConnected;

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

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

                // 비동기적으로 들어오는 자료를 수신하기 위해 BeginReceive 메서드 사용!
                m_ClientSocket.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao);

                Console.WriteLine("연결 성공!");
            }
            else
            {
                Console.WriteLine("연결 실패!");
            }
        }
Esempio n. 8
0
        public void SendMessage(String message)
        {
            // 추가 정보를 넘기기 위한 변수 선언
            // 크기를 설정하는게 의미가 없습니다.
            // 왜냐하면 바로 밑의 코드에서 문자열을 유니코드 형으로 변환한 바이트 배열을 반환하기 때문에
            // 최소한의 크기르 배열을 초기화합니다.
            AsyncObject ao = new AsyncObject(1);

            // 문자열을 바이트 배열으로 변환
            ao.Buffer = Encoding.Unicode.GetBytes(message);

            ao.WorkingSocket = m_ClientSocket;

            // 전송 시작!
            try
            {
                m_ClientSocket.BeginSend(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnSendHandler, ao);
            }
            catch (Exception ex)
            {
                Console.WriteLine("전송 중 오류 발생!\n메세지: {0}", ex.Message);
            }
        }