Как я могу отправлять / получать непрерывные изображения с помощью сокета C#?
Всем привет, у меня проблема с кодом сокета.
Когда я посылаю команду "отправить" от клиента, сервер отправляет изображение клиенту, его успех.
Как я могу отправлять / получать непрерывные изображения при отправке команды "отправить"?
Пожалуйста, помогите мне, спасибо!
SERVER using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace server_image_3 { class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind(iep); server.Listen(10); Console.WriteLine("Waiting for connection..."); Socket client = server.Accept(); NetworkStream ns = new NetworkStream(client); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); //string kq = ""; while (true) { string s = sr.ReadLine(); s = s.ToUpper(); if (s.Equals("QUIT")) { break; } if (s.Equals("SEND")) { //kq = DateTime.Now.ToString("dd/MM/yyyy"); // send the file byte[] buffer = ReadImageFile("1.jpg"); client.Send(buffer, buffer.Length, SocketFlags.None); Console.WriteLine("Send success!"); } sw.Flush(); } sr.Close(); sw.Close(); client.Close(); } private static byte[] ReadImageFile(String img) { FileInfo fileinfo = new FileInfo(img); byte[] buf = new byte[fileinfo.Length]; FileStream fs = new FileStream(img, FileMode.Open, FileAccess.Read); fs.Read(buf, 0, buf.Length); fs.Close(); //fileInfo.Delete (); GC.ReRegisterForFinalize(fileinfo); GC.ReRegisterForFinalize(fs); return buf; } } }
////////////////////
КЛИЕНТ
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; namespace client_image_3 { class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(iep); NetworkStream ns = new NetworkStream(client); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); while (true) { string input = Console.ReadLine(); sw.WriteLine(input); sw.Flush(); if (input.ToUpper().Equals("QUIT")) { break; } else { // receive data byte[] buffer = new byte[1000000]; client.Receive(buffer, buffer.Length, SocketFlags.None); Console.WriteLine("Receive success"); FileStream fs = File.Create("1.jpg"); fs.Write(buffer, 0, buffer.Length); //fs.Close(); } // //string kq = sr.ReadLine(); // Console.WriteLine(kq); } sr.Close(); sw.Close(); ns.Close(); client.Close(); } } }
[no name]
где УР проблема
Member 10390715
FileStream fs = файл.Создать("1.jpg");
ПС.Записи(буфера, 0, буфер.Длина);
если у меня есть этот код, изображение будет сохранено, но оно будет отправлено только один раз, потому что повторите имя 1.jpg в папке. Но если у меня нет этого кода, он не сохранит изображение. Как я могу это исправить?
Richard MacCutchan
вам нужно реализовать протокол между сервером и клиентом, где каждому файлу предшествует некоторая информация о его имени и размере. Затем клиент может прочитать эту информацию, и он будет знать, когда он получил полный файл. Затем он начинает читать следующий файл и так далее, пока сервер не отправит сообщение о том, что файлов больше нет.
Member 10390715
спасибо
Member 10390715
но я не знаю, как это сделать. Ты можешь мне сказать?
Richard MacCutchan
Это я тебе уже говорил. Вы должны создать протокол сообщений, который будет понятен каждому концу сокета. Часть сообщения может быть типом транзакции, например:
1. именем
2. файл данных
3. маркер конца файла
... прием.
Затем сервер отправляет эти сообщения клиенту, и клиент принимает меры в соответствии с типом сообщения.
Помните, что это ваш проект, поэтому вы должны решить, как вы хотите его реализовать.
Member 10390715
спасибо
Sergey Alexandrovich Kryukov
Подход выглядит так плохо... Мы можем обсудить, как подойти к делу, если вы объясните свою конечную цель. Это какая-то анимация? Из какого источника данных, вызванного чем? И так далее...
—СА