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); }
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); }