• 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;

    }

    }



    }
  • 相关阅读:
    【转】Exchange Server 的防火墙开放端口
    【转】AD常用端口
    centos6安装python3
    CMD下的netstat命令
    CMD定时倒数
    【转】netstat 的10个基本用法
    不联网如何PING通WIN主机和VMWARE(懵懂版,不含原理)
    【转载】Putty出现 Network error:Software caused connection abort
    MFC Unicode 字符集下格式转换
    MFC嵌套OpenCV窗口并显示图片
  • 原文地址:https://www.cnblogs.com/angellapples/p/2169346.html
Copyright © 2020-2023  润新知