예제 #1
0
        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;
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
 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);
                 }
             }
         }
     }
 }