首先说个废话我是做商场的- -今天开始pos项目正式部署赞一个^_^......在这个项目中用了个中间层,用tcp来回传递数据。。。但一直有个毛病,不能传输超量的数据~ ~我的定的是5mb一次传输超过这个就丢包,后来才用,发送数据的时候首先扩展前8位,然后再在发送,这前8位就是数据长度~~好麻烦,接收了后在根据读取的流-去数量直到读取完毕。。。。。。。今天看到一个佛洛依德哥特式的方法,就是蒙人...:首先我发送10mb数据,首先接收5mb,检查下如果还有一个字节,在扩展5mb。。。。直到读取完毕哈哈我觉得好用...最起码省事情~ ~就是浪费了点内存。贴出源码来大家分享下............
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace TcpDll { public delegate void MyDelegate(string temp); ////// 控制网络流的对象 /// public class ClientTcp { //设置网络流局部对象 private NetworkStream ns; //声明类型为MyDelegate的事件MyEvent public event MyDelegate MyEvent; ////// /// /// public ClientTcp(NetworkStream ns) { this.ns = ns; } ////// 接收对象通过 MyEvent 抛出流 /// public void Read() { //获得相关的封装流 //StreamReader sr = new StreamReader(ns); //string temp = sr.ReadLine(); //接收到客户端消息后触发事件将消息回传 //MyEvent(temp); //StreamWriter sw = new StreamWriter(ns); //转换为大写后发送消息给客户端 //sw.WriteLine(temp.ToUpper()); //sw.Flush(); // sw.Close(); //sr.Close(); } ////// /// /// 发送流 /// 接收大小 ///返回流 public static byte[] Read2Buffer(Stream stream, int BufferLen) { //// 如果指定的无效长度的缓冲区,则指定一个默认的长度作为缓存大小 //if (BufferLen < 1) //{ // BufferLen = 0x8000; //} // 初始化一个缓存区 byte[] buffer = new byte[BufferLen]; int read = 0; int block; // 每次从流中读取缓存大小的数据,直到读取完所有的流为止 while ((block = stream.Read(buffer, read, buffer.Length - read)) > 0) { // 重新设定读取位置 read += block; // 检查是否到达了缓存的边界,检查是否还有可以读取的信息 if (read == buffer.Length) { // 尝试读取一个字节 int nextByte = stream.ReadByte(); // 读取失败则说明读取完成可以返回结果 if (nextByte == -1) { return buffer; } // 调整数组大小准备继续读取 byte[] newBuf = new byte[buffer.Length * 2]; Array.Copy(buffer, newBuf, buffer.Length); newBuf[read] = (byte)nextByte; // buffer是一个引用(指针),这里意在重新设定buffer指针指向一个更大的内存 buffer = newBuf; read++; } } // 如果缓存太大则使用ret来收缩前面while读取的buffer,然后直接返回 // byte[] ret = new byte[read]; // Array.Copy(buffer, ret,read); //return ret; return buffer; } } }