Beispiel #1
0
        private void AsyncHandleServReceive(IAsyncResult ar)
        {
            AsyncServObject ao = (AsyncServObject)ar.AsyncState;
            Int32 recvBytes = ao.workSocket.EndReceive(ar);

            if (recvBytes > 0)
            {
                String strmsgAsyncServ = Encoding.UTF8.GetString(ao.buffer);
                string[] strmsgSplit = strmsgAsyncServ.Trim().Split('/');
                switch (strmsgSplit[0])
                {
                    case "AsyncFileTrans":
                        listBoxAsyncServ.Items.Add("상대방이 파일전송을 희망합니다.");
                        buttonAsyncServFileSend.Enabled = false;
                        if (MessageBox.Show("상대방이 파일전송을 희망합니다. 수락하시겠습니까 ?", "파일전송", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {
                            ao.inibuffer();
                            ao.buffer = Encoding.UTF8.GetBytes("AsyncFileTransYes/");
                            socketAyncServerMain.BeginSend(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, asyncCbServSend, ao);
                            //파일전송
                            if (fileWorkServConnectSocket == null || !fileWorkServConnectSocket.Connected)
                            {
                                IPEndPoint ipEPAcceptClient = (IPEndPoint)socketAyncServerMain.RemoteEndPoint;

                                asyncCbServFileSend = new AsyncCallback(AsyncHandleServFileSend);
                                asyncCbServFileConnect = new AsyncCallback(AsyncHandleServFileConnect);
                                asyncCbServFileReceive = new AsyncCallback(AsyncHandleServFileRecv);
                                fileWorkServConnectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                fileWorkServConnectSocket.BeginConnect(new IPEndPoint(ipEPAcceptClient.Address, 8889), asyncCbServFileConnect, fileWorkServConnectSocket);
                            }
                            AsyncFileFormLoad AsyncFileReceive = new AsyncFileFormLoad(FileFormLoad);
                            this.Invoke(AsyncFileReceive, "FileReceive", "Server");
                        }
                        else
                        {
                            buttonAsyncServFileSend.Enabled = true;
                            ao.inibuffer();
                            ao.buffer = Encoding.UTF8.GetBytes("AsyncFileTransNo/");
                            socketAyncServerMain.BeginSend(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, asyncCbServSend, ao);
                            //거절의사 전송
                        }
                        break;
                    case "AsyncFileTransYes":
                        listBoxAsyncServ.Items.Add("상대방이 파일전송을 허락하였습니다.");
                        AsyncFileFormLoad AsyncFileTrans = new AsyncFileFormLoad(FileFormLoad);
                        this.Invoke(AsyncFileTrans, "FileTrans", "Server");

                        break;
                    case "AsyncFileTransNo":
                        listBoxAsyncServ.Items.Add("상대방이 파일전송을 거절하였습니다.");
                        buttonAsyncServFileSend.Enabled = true;

                        break;
                    case "ImageSend":
                        //클라이언트가 나에게 사진전송을 허락할것인지 묻는 메시지
                        listBoxAsyncServ.Items.Add("상대방이 사진을 공유하고 싶어합니다.");
                        buttonAsyncServSendPicture.Enabled = false;
                        if (MessageBox.Show("상대방이 사진을 공유하고 싶어합니다. 수락하시겠습니까 ?", "사진전송", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {
                            btAsyncServerPicture = new byte[Convert.ToInt32(strmsgSplit[1])];
                            ao.inibuffer();
                            ao.buffer = Encoding.UTF8.GetBytes("ImageOK/");
                            socketAyncServerMain.BeginSend(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, asyncCbServSend, ao);
                            //파일전송
                            if (ImageAsyncServConnectSocket == null || !ImageAsyncServConnectSocket.Connected)
                            {
                                IPEndPoint ipEPAcceptClient = (IPEndPoint)socketAyncServerMain.RemoteEndPoint;

                                asyncCbServImageSend = new AsyncCallback(AsyncHandleServImageSend);
                                asyncCbServImageConnect = new AsyncCallback(AsyncHandleServImageConnect);
                                asyncCbServImageReceive = new AsyncCallback(AsyncHandleServImageReceive);
                                ImageAsyncServConnectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                ImageAsyncServConnectSocket.BeginConnect(new IPEndPoint(ipEPAcceptClient.Address, 7879), asyncCbServImageConnect, ImageAsyncServConnectSocket);
                            }

                            if (msPictureAsyncServ != null)
                            {
                                msPictureAsyncServ.Flush();
                                msPictureAsyncServ.Close();
                                msPictureAsyncServ.Dispose();
                                msPictureAsyncServ = null;
                            }
                            msPictureAsyncServ = new MemoryStream();
                        }
                        else
                        {
                            ao.inibuffer();
                            ao.buffer = Encoding.UTF8.GetBytes("ImageNO/");
                            socketAyncServerMain.BeginSend(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, asyncCbServSend, ao);
                            //거절의사 전송
                            buttonAsyncServSendPicture.Enabled = true;
                        }
                        break;
                    case "ImageOK":
                        //클라이언트가 사진전송을 허락하여 사진전송
                        listBoxAsyncServ.Items.Add("상대방이 사진공유를 허락하였습니다.");
                        AsyncServSendImage();
                        break;
                    case "ImageNO":
                        //클라이언트가 사진전송을 거절하여 사진거절
                        listBoxAsyncServ.Items.Add("상대방이 사진공유를 거절하였습니다.");
                        buttonAsyncServSendPicture.Enabled = true;
                        break;
                    default:
                        textBoxAsyncServChatArea.AppendText(Encoding.UTF8.GetString(ao.buffer));
                        textBoxAsyncServChatArea.AppendText("\r\n");
                        break;
                }
            }
            listBoxAsyncServ.SelectedIndex = listBoxAsyncServ.Items.Count - 1;
            Thread.Sleep(10);
            ao.inibuffer();
            ao.workSocket.BeginReceive(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, asyncCbServrecv, ao);
        }
Beispiel #2
0
        private void AsyncHandleServFileRecv(IAsyncResult ar)
        {
            AsyncServObject ao = (AsyncServObject)ar.AsyncState;
            Int32 recvBytes = ao.workSocket.EndReceive(ar);

            if (recvBytes > 0)
            {
                string message = Encoding.UTF8.GetString(ao.buffer);
                string[] splitMsg = message.Trim().Split('/');
                switch (splitMsg[0])
                {
                    case "FileSize":
                        //splitmsg[1] = "파일크기";
                        //splitmsg[2] = "파일이름";
                        string[] splitMsg2 = splitMsg[2].Split('.');
                        splitMsg2[0] += " 새로전송됨." + splitMsg2[1];

                        saveFileDialog1.DefaultExt = splitMsg2[1];
                        saveFileDialog1.InitialDirectory = @"C:\";
                        saveFileDialog1.RestoreDirectory = true;

                        AsyncFileFormLoad AsyncServerSaveDialog = new AsyncFileFormLoad(FileFormLoad);
                        this.Invoke(AsyncServerSaveDialog, "SaveDialogServer", message);

                        //ao.workSocket.Send(Encoding.UTF8.GetBytes("OK/"));
                        break;
                    case "FileFormAcceptClose":
                        if (FileServTrans.Visible && !FileServTrans.IsDisposed)
                        {
                            Form1.toform2 -= new Form1.AsyncFileTrans(FileServTrans.SetFileTextBox);
                            FileServTrans.Dispose();
                            MessageBox.Show("상대방이 파일전송 폼을 종료하여 자동 종료되었습니다.");
                            buttonAsyncServFileSend.Enabled = true;
                        }
                        break;
                    case "FileFormConnectClose":
                        if (FileServReceive.Visible && !FileServReceive.IsDisposed)
                        {
                            Form1.toform2 -= new Form1.AsyncFileTrans(FileServReceive.SetFileTextBox);
                            FileServReceive.Dispose();
                            MessageBox.Show("상대방이 파일전송 폼을 종료하여 자동 종료되었습니다.");
                            buttonAsyncServFileSend.Enabled = true;
                        }
                        break;
                    case "OK":
                        toform2("OK", 3, null);
                        break;
                    case "NO":
                        toform2("NO", 4, null);
                        break;
                    default:
                        if (asyncStreamServfileRecv != null)
                            asyncStreamServfileRecv.Write(ao.buffer, 0, ao.buffer.Length);
                        toform2(Encoding.UTF8.GetString(ao.buffer), 2, asyncStreamServfileRecv);
                        break;

                }
            }

            ao.inibuffer();
            ao.workSocket.BeginReceive(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, asyncCbServFileReceive, ao);
        }