tcp读取数据的方法

首先说个废话我是做商场的- -今天开始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);
/// <summary>
/// 控制网络流的对象
/// </summary>
public class ClientTcp
{

//设置网络流局部对象
private NetworkStream ns;

//声明类型为MyDelegate的事件MyEvent
public event MyDelegate MyEvent;

/// <summary>
///
/// </summary>
/// <param name="ns"></param>
public ClientTcp(NetworkStream ns)
{
this.ns = ns;
}

/// <summary>
/// 接收对象通过 MyEvent 抛出流
/// </summary>
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();
}


/// <summary>
///
/// </summary>
/// <param name="stream">发送流</param>
/// <param name="BufferLen">接收大小</param>
/// <returns>返回流</returns>
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;

}

}



}
原文地址:https://www.cnblogs.com/angellapples/p/2169346.html