C# 通过TCPClient发送和接收大量数据不会读取所有数据
在此代码中接收字节(服务器) 发送字节(客户端),发送长度为4047810的字节。但是上面的服务器代码只接收4039618字节。请帮助某人。你不知道吗?在读取最后一组数据时,它将从while循环中出来。请测试此代码并告诉我问题所在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
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);
}
}