public bool SendFile(Socket socket, string stringFilepathToSend) { //함수로 들어온 전달인자들은 null검사를 기본적을 해줍니다. if (socket == null || string.IsNullOrEmpty(stringFilepathToSend)) return false; try { //file이 있는지 검사합니다. if (File.Exists(stringFilepathToSend) == false) { Console.WriteLine("File not exist"); return false; } //fileData전송 시 client에서 file에대한 정보를 얻을 수 있도록 fileData앞부분에 파일구분 flag, file이름, file이름의 길이 정보를 더해줍니다. string stringFileName = Path.GetFileName(stringFilepathToSend); //전송에 필요한 정보들을 byte[]형식으로 준비합니다. byte[] byteArrayMesageType = Encoding.Unicode.GetBytes("F");//File인경우 "F", 일반 Message인경우 "M"을 더합니다. byte[] byteArrayFileName = Encoding.Unicode.GetBytes(stringFileName);//File이름 byte[] byteArrayFileLength = BitConverter.GetBytes(byteArrayFileName.Length);//File이름 길이 byte[] byteArrayFile = File.ReadAllBytes(stringFilepathToSend);//FileData byte[] byteArrayTotal = new byte[byteArrayMesageType.Length + byteArrayFileLength.Length + byteArrayFileName.Length + byteArrayFile.Length]; //전송에 필요한 정보들을 byteArraTotal배열안으로 넣어줍니다. System.Buffer.BlockCopy(byteArrayMesageType, 0, byteArrayTotal, 0, byteArrayMesageType.Length); System.Buffer.BlockCopy(byteArrayFileLength, 0, byteArrayTotal, byteArrayMesageType.Length , byteArrayFileLength.Length); System.Buffer.BlockCopy(byteArrayFileName, 0, byteArrayTotal, byteArrayMesageType.Length + byteArrayFileLength.Length, byteArrayFileName.Length); System.Buffer.BlockCopy(byteArrayFile, 0, byteArrayTotal, byteArrayMesageType.Length + byteArrayFileLength.Length + byteArrayFileName.Length, byteArrayFile.Length); Telegram _telegram = new Telegram(); _telegram.SetData(byteArrayTotal); SocketAsyncEventArgs _sendArgs = new SocketAsyncEventArgs(); _sendArgs.SetBuffer(BitConverter.GetBytes(_telegram.DataLength), 0, 4); _sendArgs.Completed += new EventHandler<SocketAsyncEventArgs>(Send_Completed); _sendArgs.UserToken = _telegram; //1단계로 전송하려는 Data의 크기만 비동기로 전송합니다. //전송이 완료되면 Send_Completed가 호출되고 그곳에서 실제 data를 전송합니다. socket.SendAsync(_sendArgs); return true; } catch (Exception e) { Console.WriteLine(e.Message); return false; } }
private void Accept_Completed(object sender, SocketAsyncEventArgs e) { Socket _client = e.AcceptSocket; Telegram _telegram = new Telegram(); SocketAsyncEventArgs _receiveArgs = new SocketAsyncEventArgs(); _receiveArgs.UserToken = _telegram; _receiveArgs.SetBuffer(_telegram.GetBuffer(), 0, 4); _receiveArgs.Completed += new EventHandler<SocketAsyncEventArgs>(Recieve_Completed); _client.ReceiveAsync(_receiveArgs); m_Client.Add(_client); SendDisplay("Client Connection!",ChatType.System); Socket _server = (Socket)sender; e.AcceptSocket = null; _server.AcceptAsync(e); }
public void DataInput() { //사용자 키보드로부터 입력을 대기하다 입력이 들어오면 클라이언트로 해당 내용을 전송해줍니다. String sData; Telegram _telegram = new Telegram(); m_Client = new List<Socket>(); SendDisplay("ChattingProgram ServerStart", ChatType.System); while (true) { sData = Console.ReadLine(); if (sData.CompareTo("exit") == 0) { break; } else { foreach (Socket _client in m_Client) { if (!_client.Connected) { m_Client.Remove(_client); } else { sData = "M" + sData;//Message : "M" + string message _telegram.SetData(sData); SocketAsyncEventArgs _sendArgs = new SocketAsyncEventArgs(); _sendArgs.SetBuffer(BitConverter.GetBytes(_telegram.DataLength), 0, 4); _sendArgs.Completed += new EventHandler<SocketAsyncEventArgs>(Send_Completed); _sendArgs.UserToken = _telegram; _client.SendAsync(_sendArgs); } } } } }