Beispiel #1
0
        private void tcpAsyncServer_ReceiveServerEvent(object sender, ReceiveServerEventArgs e)
        {
            this.Invoke((EventHandler)(delegate
            {
                NetPacket np = (NetPacket)e.netPacket;
                switch (np.PacketHead.PType)
                {
                case NetPacket.NetPacketType.STRING:
                    textBox1.AppendText("收到字符串" + np.Data.ToString() + "\r\n");
                    tcpAsyncServer.Send(e.Client, NetPacket.MakeStringPacket("服务器收到数据" + np.Data.ToString()));
                    break;

                case NetPacket.NetPacketType.BINARY:
                    NetFile nf = (NetFile)np.Data;
                    textBox1.AppendText("收到文件" + nf.FileName + ",正在后台生成.....\r\n");
                    string file = System.Windows.Forms.Application.StartupPath + "\\收到的文件\\" + nf.FileName;
                    FileInfo f = new FileInfo(file);
                    if (!Directory.Exists(f.DirectoryName))
                    {
                        Directory.CreateDirectory(f.DirectoryName);
                    }
                    FileStream fs = null;
                    fs = new FileStream(file, FileMode.Create);
                    fs.BeginWrite(nf.Content, 0, nf.Content.Length, NetFileWriteOK, fs);
                    break;

                case NetPacket.NetPacketType.COMPLEX:
                    NetObject no = (NetObject)np.Data;
                    textBox1.AppendText("收到序列对象" + no.TypeName + ",正在后台生成.....\r\n");
                    break;
                }
            }));
        }
Beispiel #2
0
        } // SendMessageToServer

        private void ButtonSendFile_Click(object sender, EventArgs e)
        {
            // Получаем сетевой поток клиента
            _netStream = _client.GetStream();

            // Если поток может писать
            if (_netStream.CanWrite) {
                // Формируем стандартный диалог 
                OpenFileDialog openFileDialog = new OpenFileDialog() {
                    InitialDirectory = @"d:\",
                    Filter = "All files (*.*)|*.*",
                    Multiselect = false,
                    ValidateNames = true
                };
                if (openFileDialog.ShowDialog() != DialogResult.OK) return;

                // Получаем путь к файлу
                string filename = openFileDialog.FileName;

                // Читаем байты выбранного файлика
                NetFile f = new NetFile() {
                    Data = File.ReadAllBytes(filename),
                    FileName = Path.GetFileNameWithoutExtension(filename),
                    Extension = Path.GetExtension(filename)
                };

                // Если контрольная сумма не дай бог null - уносим ноги
                if (string.IsNullOrEmpty(f.Checksum)) return;

                // Инициализируем новое сообщение
                ChatMessage msg = new ChatMessage {
                    UserFrom = textBoxUsername.Text,
                    UserTo = textBoxWhom.Text,
                    File = f,
                    Type = MessageType.File
                };

                // Конвертируем информацию о сообщении в массив байт для отправки по сети
                byte[] buf = msg.ToArray();

                // Записываем байты в сетевой поток
                _netStream.Write(buf, 0, buf.Length);

                // Ожидаем отправки по сети
                _netStream.Flush();

                // Отображаем в чате факт того что наш файл был отправлен
                SendTextToListBox($"{msg.UserFrom} sent the file \"{Path.GetFileName(filename)}\" to the user.");
                textBoxMessage.Text = "";
            } // if
        } // buttonSendFile_Click
Beispiel #3
0
        static void Main(string[] args)
        {
            try {
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);

                Socket listenSoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                listenSoc.Bind(endPoint);
                listenSoc.Listen(10);
                Console.WriteLine("Server is running...");

                int       bytes      = 0;
                const int bufferSize = 8192;
                while (true)
                {
                    Socket handler = listenSoc.Accept();

                    Netfile file;
                    using (MemoryStream memStream = new MemoryStream()) {
                        byte[] buffer = new byte[bufferSize];
                        do
                        {
                            int received = handler.Receive(buffer);
                            //File.AppendAllText("Log.log", string.Format("Received={0}\r\n", received));
                            memStream.Write(buffer, 0, received);
                            bytes += received;
                        }while (handler.Available > 0);
                        file = new NetFile(memStream.ToArray());
                    }
                    Console.WriteLine("Size of received data: " + bytes.ToString() + " bytes");

                    using (FileStream stream = new FileStream(file.FileName, FileMode.Create, FileAccess.Write))
                    {
                        stream.Write(file.Data, 0, file.Data.Length);
                    }

                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();

                    bytes = 0;
                }
            }
            catch (Exception error)
            {
                Console.WriteLine(error.ToString());
                Console.ReadKey();
            }
        }
Beispiel #4
0
        } // ValidateBinary
        

        private void ServerDoListen(object client)
        {
            // Получить поток для передачи информации
            using (NetworkStream netStream = (client as TcpClient)?.GetStream()) {
                while (true) {
                    if (netStream.CanRead) {
                        byte[] response;

                        try {
                            // Получаем ответ от клиента
                            response = GetResponse(netStream);

                            // Десериализуем сообщение
                            ChatMessage msg = ChatMessage.FromArray(response);

                            // Определяем тип сообщения
                            switch (msg.Type) {
                                // Если был отправлен текст - выводим его в окно чата
                                case MessageType.Text:
                                    SendTextToListBox($"{msg.UserFrom}: {msg.Message}");
                                    break;

                                // Если был отправлен файл - предлагаем его сохранить
                                case MessageType.File:
                                    // Получаем данные о файле
                                    NetFile f = msg.File;

                                    // Предлагаем сохранить его
                                    DialogResult saveFile = MessageBox.Show($"The client sent a file.\n\"{f.FileName}{f.Extension}\"\nSave it?",
                                        "File from the client", MessageBoxButtons.YesNo);

                                    // Если да - сохраняем
                                    if (saveFile == DialogResult.Yes)
                                        SaveFile(f);
                                    break;
                            } // switch
                        } catch (Exception ex) {
                            MessageBox.Show($"The server will be stopped\n{ex.Message}", 
                                "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            listViewConnectedClients.Items.Clear();
                            _listener.Stop();
                            break;
                        } // try-catch
                    } // if
                } // while
            } // using
        } // ServerDoListen
Beispiel #5
0
        } // ValidateBinary


        void ClientDoListen(object client)
        {
            SendTextToListBox($"Connection with server {textBoxHostName.Text}:{textBoxPort.Text} opened");

            using (NetworkStream netStream = (client as TcpClient)?.GetStream()) {
                while (true) {
                    if (netStream.CanRead) {
                        byte[] response;

                        try {
                            // Получаем ответ от клиента
                            response = GetResponse(netStream);

                            // Десериализуем сообщение
                            ChatMessage msg = ChatMessage.FromArray(response);

                            // Определяем тип сообщения
                            switch (msg.Type) {
                                // Если был отправлен текст - выводим его в окно чата
                                case MessageType.Text:
                                    SendTextToListBox($"{msg.UserFrom}: {msg.Message}");
                                    break;

                                // Если был отправлен файл - предлагаем его сохранить
                                case MessageType.File:
                                    // Получаем данные о файле.
                                    NetFile f = msg.File;

                                    // Предлагаем сохранить его.
                                    DialogResult saveFile = MessageBox.Show($"You have been sent a file. \"{f.FileName}{f.Extension}\"\nSave it?",
                                        "File from the server", MessageBoxButtons.YesNo);

                                    // Если да - сохраняем
                                    if (saveFile == DialogResult.Yes)
                                        SaveFile(f);
                                    break;
                            } // switch
                        } catch (Exception) {
                            SendTextToListBox($"Connection with server {textBoxHostName.Text}:{textBoxPort.Text} closed");
                            break;
                        } // try-catch
                    } // if
                } // while
            } // using
        } // ClientDoListen
Beispiel #6
0
        } // ClientDoListen


        // Вызывает стандартный диалог сохранения файла и сохраняет
        private void SaveFile(NetFile f)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog() {
                InitialDirectory = @"d:\",
                Filter = $"(*{f.Extension})|*{f.Extension}|All files (*.*)|*.*",
                FileName = $"{f.FileName}",
                ValidateNames = true
            };

            ShowSaveFileDialogInvoker invoker = saveFileDialog.ShowDialog;

            if (Invoke(invoker).Equals(DialogResult.Cancel)) return;

            string filename = saveFileDialog.FileName;

            File.WriteAllBytes(filename, f.Data);
            MessageBox.Show("File successfully saved!", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
        } // SaveFile
Beispiel #7
0
        } // buttonSendFile_Click

        // Отправляет файл конкретному клиенту
        private void SendFile(TcpClient client, string filename)
        {
            // Получаем сетевой поток клиента
            _netStream = client.GetStream();

            // Если поток может писать
            if (_netStream.CanWrite) {
                // Получаем информацию об отправляемом файле
                NetFile f = new NetFile() {
                    Data = File.ReadAllBytes(filename),
                    FileName = Path.GetFileNameWithoutExtension(filename),
                    Extension = Path.GetExtension(filename)
                };

                // Если контрольная сумма не дай бог null - уносим ноги
                if (string.IsNullOrEmpty(f.Checksum)) return;

                // Инициализируем новое сообщение
                ChatMessage msg = new ChatMessage {
                    UserFrom = "Admin",
                    File = f,
                    Type = MessageType.File
                };

                // Конвертируем информацию о сообщении в массив байт для отправки по сети
                byte[] buf = msg.ToArray();

                // Записываем байты в сетевой поток
                _netStream.Write(buf, 0, buf.Length);

                // Ожидаем отправки по сети
                _netStream.Flush();

                // Отображаем в чате факт того что наш файл был отправлен
                SendTextToListBox($"Admin sent the file \"{Path.GetFileName(filename)}\"");
                textBoxMessage.Text = "";
            } // if
        } // SendFile
Beispiel #8
0
        public void Start(int listenPort)
        {
            ListenPort = listenPort;
            ipEndPoint = new IPEndPoint(ipAddr, ListenPort);
            listenSoc  = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            listenSoc.Bind(ipEndPoint);
            listenSoc.Listen(10);

            listen = true;

            byte[]    bytePath;
            int       bytes       = 0;
            int       packageSize = 0;
            const int _BUFFERSIZE = 8192;

            while (true)
            {
                //Thread t = new Thread(delegate()
                //{
                //});
                try
                {
                    handler = listenSoc.Accept();
                }
                catch (Exception e)
                {
                    if (listen)
                    {
                        throw e;
                    }
                    else
                    {
                        break;
                    }
                }

                Invoke(new Action(() =>
                {
                    ConsoleWrite(handler.RemoteEndPoint.ToString() + " connected");
                }));

                handler.Send(GetSendFileListPackage(filesList));

                using (MemoryStream memStream = new MemoryStream())
                {
                    byte[] buffer = new byte[_BUFFERSIZE];
                    do
                    {
                        int received = handler.Receive(buffer);
                        memStream.Write(buffer, 0, received);
                        bytes += received;
                        if (bytes >= 2049 && packageSize == 0)
                        {
                            packageSize = GetPackageSize(memStream.ToArray());
                        }
                    }while (bytes < packageSize);
                    packageSize = 0;
                    bytes       = 0;
                    bytePath    = memStream.ToArray();
                    if (bytePath.Length == 0)
                    {
                        continue;
                    }
                }

                if (IsManyFiles(bytePath))
                {
                    string[] paths = GetReceivePaths(bytePath);
                    NetFiles files = new NetFiles();
                    foreach (string path in paths)
                    {
                        using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
                        {
                            byte[]  byteFile = new byte[stream.Length];
                            int     length   = stream.Read(byteFile, 0, byteFile.Length);
                            NetFile file     = new NetFile();
                            file.FileName = Path.GetFileName(stream.Name);
                            file.Data     = byteFile;
                            files.Add(file);
                        }
                    }
                    byte[] fullPackage = GetSendFilePackage(files.ToArray());
                    handler.Send(fullPackage);
                    Invoke(new Action(() =>
                    {
                        ConsoleWrite(string.Format("Отправлено {0} байт", fullPackage.Length));
                    }));
                }
                else
                {
                    string  path = GetReceivePath(bytePath);
                    NetFile file = new NetFile();
                    using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
                    {
                        byte[] byteFile = new byte[stream.Length];
                        int    length   = stream.Read(byteFile, 0, byteFile.Length);
                        file.FileName = Path.GetFileName(stream.Name);
                        file.Data     = byteFile;
                    }
                    byte[] fullPackage = GetSendFilePackage(file.ToArray());
                    handler.Send(fullPackage);
                    Invoke(new Action(() =>
                    {
                        ConsoleWrite(string.Format("Отправлено {0} байт", fullPackage.Length));
                    }));
                }
            }
        }