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