Member 10390715 Ответов: 1

Как я могу отправлять / получать непрерывные изображения с помощью сокета 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

Подход выглядит так плохо... Мы можем обсудить, как подойти к делу, если вы объясните свою конечную цель. Это какая-то анимация? Из какого источника данных, вызванного чем? И так далее...
—СА

1 Ответов

Рейтинг:
11

vikinghunter

Почему бы просто не использовать класс "файл"?

Ваш сервер:

 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...");
        using (Socket client = server.Accept())
        {
            while (true)
            {
                string s = Console.ReadLine().ToUpper();

                if (s.Equals("QUIT"))
                {
                    break;
                }
                if (s.Equals("SEND"))
                {
                    // send the file
                    byte[] buffer = File.ReadAllBytes("1.jpg");
                    client.Send(buffer, buffer.Length, SocketFlags.None);
                    Console.WriteLine("Send success!");
                }
            }
        }
    }
}


Ваш клиент:

class Program
{
    static void Main(string[] args)
    {
        IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
        using (Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            client.Connect(iep);

            while (true)
            {
                string input = Console.ReadLine();

                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");

                    File.WriteAllBytes("1.jpg", buffer);
                }
            }
        }
    }
}


Member 10390715

Спасибо, я постараюсь его.