【发布时间】: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