我在客户端有许多条记录要上传到服务器上.
 OleDbCommand cmd = new OleDbCommand("select * from images", sysConn.conn);
                OleDbDataReader dr = cmd.ExecuteReader();
                string[] str = new string[7];
                string strSender;
                TcpClient client = new TcpClient("192.168.1.168", 8181);
                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        
                        NetworkStream ns = client.GetStream();                
                        
                        //在这里发送或接收
                        str[0] = dr[0].ToString();
                        str[1] = dr[1].ToString();
                        str[2] = dr[2].ToString();
                        str[3] = dr[3].ToString();
                        str[4] = dr[4].ToString();
                        str[5] = dr[5].ToString();
                        str[6] = dr[6].ToString();
                        strSender = String.Join(",", str);
                        
                        
                        byte[] bStr = System.Text.Encoding.BigEndianUnicode.GetBytes(strSender);
                    }
                }
假如有三条记录.我想一条一条的发往服务器.可以现在服务器端接收的时候是把三条记录一下全部接收了.怎么回事!服务器代码:            int porNum = 8181;
            bool done = false;
            IPAddress ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
            TcpListener listener = new TcpListener(ip, porNum);
            listener.Start();
            while (!done)
            {
                Console.Write("正在侦听81端口...");
                TcpClient client = listener.AcceptTcpClient();                Console.WriteLine(" 处理连接请求...");
                NetworkStream ns = client.GetStream();
                //ns.Read(,0,);
                
                byte[] bytes = new byte[1024];
                int bytesRead = ns.Read(bytes, 0, bytes.Length);                //接收数据库
                string str = Encoding.BigEndianUnicode.GetString(bytes, 0, bytesRead);                Console.WriteLine(Encoding.BigEndianUnicode.GetString(bytes, 0, bytesRead));
                byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());
                try
                {
                    ns.Write(byteTime, 0, byteTime.Length);
                    ns.Close();
                    client.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            listener.Stop();

解决方案 »

  1.   

    因为tcp是流式协议,当你3条记录放到缓冲区,tcp会计算数据量足够了,一次发送出去。
      

  2.   

    客户端每发送一条就sleep一段时间再发下一条信息
    或者客户端在发完一条信息后,等服务器收到信息后,让服务器给客户端发一条信息,表示已正确接收到一条信息,客户端检测到该信息之后再发下一条信息
      

  3.   


    既然你用了while,结束标志为读不到数据,那么就不应该设置那么大的缓存,你的byte[] b应该给小点,一般设置为1024字节:byte[] b = new byte[1024]
    无论发送方还是接收放,一次性发送或者接收数据都不能过大,因为一个TCP包最大大小也只有1500字节,如果你过大了,也会自动分包发送的,不分包就会直接被丢弃,导致数据包无法发送成功。
    这里有我上传的VS2008上执行的例子,即使不是VS2008,也就一个匿名委托部分需要自己实现,接收发送部分都可以参考:实现简单的Socket文件传输示例
      

  4.   

    Toyalan
     我下载不了呀.发我邮箱里可以吗?
    654290679@qq.com
      

  5.   

    有个标记,可以立即发送,你baidu一下就知道
      

  6.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    namespace MyCSDN
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                
            }        private void button1_Click(object sender, EventArgs e)
            {
                string[] ready_send_file=all_files.Split('^');  //我用^来标示文件
                for(i=0;i<ready_send_file.Length;i++)
                {
                    SendFile(ready_send_file[i]);  //将文件名作为参数
                }
            }        private void SendFile(string path) 
            {
               TcpClient client = new TcpClient("192.168.1.254",9999);
              NetworkStream nk =client.GetStream();
              
               FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read);  //注意与receive的filestream的区别
                BinaryReader binaryreader = new BinaryReader(file);
                byte[] b = new byte[4098];
                int data = 0; ;
                //Console.WriteLine("正在发送文件");
                int bodylenght = (int)file.Length;  //初始化进度条
                int uoi = 0;  //初始化进度条
                this.progressBar1.Maximum = bodylenght;  //初始化进度条
                while ((data = binaryreader.Read(b, 0,4098)) != 0)                 //这个注意是将文件写成流的形式
                {
                    uoi = uoi + 4098;
                    client.Client.Send(b, data, SocketFlags.None); //发送文件流到目标机器
                    if (uoi >= bodylenght)
                        this.progressBar1.Value = bodylenght;
                    else
                        this.progressBar1.Value = uoi;
                }
                this.label1.Text = uoi.ToString();
                client.Client.Shutdown(SocketShutdown.Both);
                client.Close();
                binaryreader.Close();
                file.Close();
           }
        }
    }