【问题标题】:Why is the buffer smaller when receiving than from what I am sending?为什么接收时缓冲区比我发送的缓冲区小?
【发布时间】:2018-07-13 14:32:29
【问题描述】:

我目前正在尝试将缓冲区从客户端发送到服务器,我尝试发送的缓冲区是我 PC 上图像中的字节数组。

说发送的时候大小大概是200k字节,但我只接收61k,不管我发送什么图片,接收缓冲区总是一样的,这是为什么呢?如何从客户端到服务器获取正确的缓冲区?

我需要整个东西,这样它就可以在收到字节数组后下载图像。

客户

using System;
using System.Drawing;
using System.IO;
using System.Net.Sockets;
using System.Text;

namespace TransferImageClient
{
    class Program
    {
        // Declare a port that we will be using for the TcpClient to connect to
        const int port = 1273;

        // Declare the server IP that TcpClient will be connecting to.
        const string server_ip = "127.0.0.1";

        static void Main(string[] args)
        {
            Console.Title = "Client";
            Console.ForegroundColor = ConsoleColor.Green;

            string texttoSend = DateTime.Now.ToString();

            TcpClient client = new TcpClient(server_ip, port);

            NetworkStream nwStream = client.GetStream();

            Console.WriteLine("Please enter the path to the image: ");

            byte[] bytesToSend = ConvertImage(Console.ReadLine());

            Console.WriteLine("Sending image..");

            nwStream.Write(bytesToSend, 0, bytesToSend.Length);

            byte[] bytesToRead = new byte[client.ReceiveBufferSize];

            int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
            Console.WriteLine("Recieved: " + Encoding.ASCII.GetString(bytesToRead, 0, bytesRead));
            Console.ReadLine();

            //Close the client so we're not leaving it open for people to eavesdrop.
            client.Close();
        }

        private static byte[] ConvertImage(string Image)
        {
            Bitmap tImage = new Bitmap(Image);
            byte[] bStream = ImageToByte(tImage);
            return bStream;
        }

        static byte[] ImageToByte(Bitmap iImage)
        {
            MemoryStream mMemoryStream = new MemoryStream();
            iImage.Save(mMemoryStream, System.Drawing.Imaging.ImageFormat.Png);
            return mMemoryStream.ToArray();
        }
    }
}

服务器

using System;
using System.Net;
using System.Net.Sockets;

namespace TransferImageServer
{
    class Program
    {
        const int port = 1273;
        const string serverIP = "127.0.0.1";

        static void Main(string[] args)
        {
            Console.Title = "Server";
            Console.ForegroundColor = ConsoleColor.Green;

            IPAddress localAdress = IPAddress.Parse(serverIP);

            TcpListener listener = new TcpListener(localAdress, port);
            Console.WriteLine("Listening..");

            listener.Start();

            TcpClient client = listener.AcceptTcpClient();

            NetworkStream nwStream = client.GetStream();

            byte[] buffer = new byte[client.ReceiveBufferSize];

            int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);

            Console.WriteLine("Recieved the image ");

            Console.ReadLine();
            //Console.WriteLine("Sending back : ");
            //nwStream.Write(buffer, 0, bytesRead);
            client.Close();
            listener.Stop();
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 您是否尝试记录bytesRead 的值?它有多大?如果它小于您尝试接收的图像的大小,那么您需要在循环中执行多个client.Read 操作,并在bytesRead 变为0时停止。

标签: c# .net sockets tcp tcpclient


【解决方案1】:

TCP 没有消息的概念。这意味着它不关心您一次写入多少字节 - 这意味着 Read 不会返回您一次写入的相同字节数。

Read 可以返回任意数量的数据,不超过发送的数量。如果您一遍又一遍地拨打Read,您将不断获得更多数据(只要有更多数据)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多