C# 通过TCPClient发送和接收大量数据不会读取所有数据

C# 通过TCPClient发送和接收大量数据不会读取所有数据,c#,asp.net,C#,Asp.net,在此代码中接收字节(服务器) 发送字节(客户端),发送长度为4047810的字节。但是上面的服务器代码只接收4039618字节。请帮助某人。你不知道吗?在读取最后一组数据时,它将从while循环中出来。请测试此代码并告诉我问题所在 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; usin

在此代码中接收字节(服务器)

发送字节(客户端),发送长度为4047810的字节。但是上面的服务器代码只接收4039618字节。请帮助某人。你不知道吗?在读取最后一组数据时,它将从while循环中出来。请测试此代码并告诉我问题所在

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Drawing;
using System.Threading;

namespace ByteLengthSending
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.Connect(IPAddress.Parse("119.43.29.182"), 8001);
            //IPAddress ipAd = IPAddress.Parse("119.43.29.182");
            //TcpClient client = new TcpClient(ipAd.ToString(), 8001);

            //NetworkStream stream = client.GetStream();
            int totread = 0;
            byte[] longBuffer = new byte[3824726];
            byte[] buffer = new byte[4096];
            using (var fileStream = File.OpenRead("C:/Foo.txt"))            
            {
                while (true)
                {
                    int read = fileStream.Read(buffer, 0, buffer.Length);
                    totread += read;
                    if (read <= 0)
                    {
                        break;
                    }
                    for (int sendBytes = 0; sendBytes < read; sendBytes += client.Send(buffer, sendBytes, read - sendBytes, SocketFlags.None))
                    {
                    }
                }                
            }
            client.Close();
            Console.WriteLine("Total Read" + totread);
            Console.In.ReadLine();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
Net系统;
使用System.Net.Sockets;
使用System.IO;
使用系统图;
使用系统线程;
通过远程发送的名称空间
{
班级计划
{
静态void Main(字符串[]参数)
{
Socket client=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
client.Connect(IPAddress.Parse(“119.43.29.182”),8001);
//IPAddress ipAd=IPAddress.Parse(“119.43.29.182”);
//TcpClient client=新的TcpClient(ipAd.ToString(),8001);
//NetworkStream=client.GetStream();
int-totread=0;
字节[]长缓冲区=新字节[3824726];
字节[]缓冲区=新字节[4096];
使用(var fileStream=File.OpenRead(“C:/Foo.txt”))
{
while(true)
{
int read=fileStream.read(buffer,0,buffer.Length);
totread+=读取;

if(read这里有一个使用my library传输文件的示例(Apache许可证)

您只需安装nuget软件包“griffin.framework”,然后创建一个控制台应用程序,并用以下内容替换
程序
类:

class Program
{
    static void Main(string[] args)
    {
        var server = new ChannelTcpListener();
        server.MessageReceived = OnServerReceivedMessage;
        server.Start(IPAddress.Any, 0);

        var client = new ChannelTcpClient<object>(new MicroMessageEncoder(new DataContractMessageSerializer()),
            new MicroMessageDecoder(new DataContractMessageSerializer()));
        client.ConnectAsync(IPAddress.Loopback, server.LocalPort).Wait();
        client.SendAsync(new FileStream("TextSample.txt", FileMode.Open)).Wait();


        Console.ReadLine();
    }

    private static void OnServerReceivedMessage(ITcpChannel channel, object message)
    {
        var file = (Stream) message;
        var reader = new StreamReader(file);
        var fileContents = reader.ReadToEnd();
        Console.WriteLine(fileContents);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var server=newchanneltcplistener();
server.MessageReceived=OnServerReceivedMessage;
server.Start(IPAddress.Any,0);
var client=new ChannelTcpClient(新的MicroMessageEncoder(新的DataContractMessageSerializer()),
新的微消息解码器(新的DataContractMessageSerializer());
ConnectAsync(IPAddress.Loopback,server.LocalPort).Wait();
sendsync(新文件流(“TextSample.txt”,FileMode.Open)).Wait();
Console.ReadLine();
}
ServerReceivedMessage上的私有静态无效(ITcpChannel,对象消息)
{
var文件=(流)消息;
var reader=新的StreamReader(文件);
var fileContents=reader.ReadToEnd();
Console.WriteLine(文件内容);
}
}

库可以发送/接收任何大小的任何类型的流(只要大小已知)。客户端将根据流的大小自动创建
MemoryStream
FileStream

您似乎忽略了在启动回调时已读取的数据,然后同步读取其余数据,这几乎否定了第一次读取是异步的首先是。你现在真的需要异步IO吗?我建议你先使用同步IO…@JonSkeet我只需要异步读取数据。请告诉我如何读取整个数据?感谢你的快速响应!!@user1805948:你为什么不使用为你处理所有IO的现有库?@jgauffin我没有得到你??哪些现有的库?你能详细说明一下吗?我已经建立了一个。想看看你如何用它发送文件吗?这完全是一个复杂的问题,我无法依赖。创建自己的套接字客户端/服务器要复杂得多;)
class Program
{
    static void Main(string[] args)
    {
        var server = new ChannelTcpListener();
        server.MessageReceived = OnServerReceivedMessage;
        server.Start(IPAddress.Any, 0);

        var client = new ChannelTcpClient<object>(new MicroMessageEncoder(new DataContractMessageSerializer()),
            new MicroMessageDecoder(new DataContractMessageSerializer()));
        client.ConnectAsync(IPAddress.Loopback, server.LocalPort).Wait();
        client.SendAsync(new FileStream("TextSample.txt", FileMode.Open)).Wait();


        Console.ReadLine();
    }

    private static void OnServerReceivedMessage(ITcpChannel channel, object message)
    {
        var file = (Stream) message;
        var reader = new StreamReader(file);
        var fileContents = reader.ReadToEnd();
        Console.WriteLine(fileContents);
    }
}