Передача изображения с клиента на сервер через сокет TCP / IP - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь завершить свой проект winform apply в c #, у меня эта проблема каждый раз. Клиент должен отправить изображение на сервер. И сервер получает изображение и отправляет на сервер sql, но сервер ничего не получает. Я думаю, проблема в стороне сервера.

Я много пытался изменить код, думаю, проблема вна стороне сервера.

Ошибка подключения или другая сторона не отвечает правильно после времени 10.0.0.8:10001

это код на стороне сервера:

    Socket hostSocket;
    Thread thread;
    string localIP = string.Empty;
    string computrHostName = string.Empty;
    private void btConnect_Click_1(object sender, EventArgs e)
    {
        computrHostName = Dns.GetHostName();
        IPHostEntry hostname = Dns.GetHostEntry(Dns.GetHostName());
        foreach (IPAddress ip in hostname.AddressList){
            if (ip.AddressFamily.ToString() == "InterNetwork")
            {
                localIP = ip.ToString();
            }
        }
        this.Text = this.Text + " | " + localIP;
        connectSocket();
    }
    private void connectSocket()
    {
        Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint hostIpEndPoint = new IPEndPoint(IPAddress.Parse(localIP), 10011);
        //Connection node
        receiveSocket.Bind(hostIpEndPoint);
        receiveSocket.Listen(10);
        MessageBox.Show("start");
        hostSocket = receiveSocket.Accept();
        thread = new Thread(new ThreadStart(trreadimage));

        thread.IsBackground = true;
        thread.Start();
    }
    private void trreadimage()
    {
        int dataSize;
        string imageName = "Image-" + System.DateTime.Now.Ticks + ".JPG" ;
        try{
            dataSize = 0;
            byte[] b = new byte[1024 * 10000];  //Picture of great
            dataSize = hostSocket.Receive(b);
            if (dataSize > 0)
            {
                MemoryStream ms = new MemoryStream(b);
                Image img = Image.FromStream(ms);
                img.Save(imageName, System.Drawing.Imaging.ImageFormat.Jpeg);
                pbimage.Image = img;
                ms.Close();
            }
        }

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Спасибо тебе !!! Для того, чтобы вы поняли, что мой проект о том, чтобы применить, что вы можете зашифровать сообщение и поместить в изображение (staganografia) и отправить в качестве изображения для получения, мы используем сервер sql для получения информации о клиентах, и, если клиент не работает,Сервер отправляет сообщения до тех пор, пока клиент включен, он может их видеть, применяется winform, если вы знаете какой-то пример кода, то как клиент может видеть сообщения, которые он получает, когда он подключился к серверу, поможет мне ...

0 голосов
/ 20 октября 2019

Вы делаете некоторые интересные вещи с IP-адресами и семействами адресов, которые я не считаю необходимыми - вы (вероятно) хотите, чтобы ваш сервер прослушивал все IP-адреса, как IPv4, так и IPv6.

Когда вы создаете MemoryStream из своего байтового массива, он всегда будет иметь длину 1024 * 10000, и это может привести к путанице в Image.FromStream, поскольку остальная часть изображения будет заполнена нулями.

ВотМой снимок на клиенте, который отправляет изображения (+ имена файлов) на сервер, который сохраняет изображения в папке. Я использую TcpClient + TcpListener вместо более общего класса Socket.

Код сервера:

class Program
{
    const int LISTENING_PORT = 10001;
    const string IMAGE_DIR = @"C:\Users\joehoper\Desktop\imgservtest\server\";
    const int BUFFER_SIZE = 10240;

    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Any, LISTENING_PORT);
        listener.Start();

        Console.WriteLine($"Listening on port {LISTENING_PORT}...");

        while (true)
        {
            var client = listener.AcceptTcpClient();
            Console.WriteLine($"Accepted client {client.Client.RemoteEndPoint}");
            ThreadPool.QueueUserWorkItem(cb => ClientThread(client));
        }
    }

    static void ClientThread(TcpClient client)
    {
        try
        {
            using (var stream = client.GetStream())
            {
                // Read filename length
                int fNameLen = stream.ReadByte();
                byte[] fNameBytes = new byte[fNameLen];

                // Read filename
                stream.Read(fNameBytes, 0, fNameLen);
                string fName = Encoding.Unicode.GetString(fNameBytes);

                using (var fs = File.OpenWrite(IMAGE_DIR + fName))
                {
                    byte[] buffer = new byte[BUFFER_SIZE];
                    while (true)
                    {
                        int r = stream.Read(buffer, 0, BUFFER_SIZE);
                        if (r == 0)
                            break;

                        fs.Write(buffer, 0, r);
                    }
                }
            }
        }

        finally
        {
            client.Close();
        }
    }
}

Код клиента:

class Program
{
    const string IMAGE_DIR = @"C:\Users\joehoper\Desktop\imgservtest\client\";
    const int CONNECT_PORT = 10001;
    const int BUFFER_SIZE = 10240;

    static void Main(string[] args)
    {
        Console.WriteLine("Press enter to start sending...");
        Console.ReadLine();

        foreach (string filename in Directory.GetFiles(IMAGE_DIR))
            SendImage(filename);
    }

    static void SendImage(string filename)
    {
        var client = new TcpClient("localhost", CONNECT_PORT);

        using (var cs = client.GetStream())
        {
            // Send filename
            byte[] fNameBytes = Encoding.Unicode.GetBytes(Path.GetFileName(filename));
            cs.WriteByte((byte)fNameBytes.Length);
            cs.Write(fNameBytes, 0, fNameBytes.Length);

            using (var fs = File.OpenRead(filename))
            {
                // Send image data
                byte[] buffer = new byte[BUFFER_SIZE];
                while (true)
                {
                    int r = fs.Read(buffer, 0, BUFFER_SIZE);
                    if (r == 0)
                        break;

                    cs.Write(buffer, 0, r);
                }
            }
        }

        client.Close();
    }
}
...