using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Net.Sockets;
 using System.Net;
 using System.Threading;
 namespace ConsoleApplication1
 {
     class Program
     {
         static Socket client;
         static void Main(string[] args)
         {
             Console.WriteLine("客户端");
             IPAddress address=Dns.GetHostAddresses(Dns.GetHostName())[1];//本地IPAddress   
           IPEndPoint port=new IPEndPoint(address,3000);
              client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
              client.Connect(port);
             client.Send(new byte[] { 1 }); //发送字节1 服务器收到后会执行一个耗时处理;
             byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hellow Word");
             //只要加上这句就能接收到,去掉就挂了。说明啥问题? 说明服务器收到数据处理的时候因为无法Receive就无法接收到客户端send过来的数据;
             //客户端这边只有让线程停一会等服务器那边处理完了数据继续Receive的时候服务器才能接收到send过来的数据;
            //Thread.Sleep(1000);
             client.Send(msg);//向服务器发送Hellow Word;
             Console.ReadKey();
         }
     }
 }using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Net.Sockets;
 using System.Threading;
 using System.Net;
 namespace ConsoleApplication4
 {
     //服务器
     class Program
     {
        static Socket Client;//服务器绑定端口 3000
        static Thread accepteThread;//监听线程;
        static Thread reseveThread;//接收线程;
        static Socket socket;
         static void Main(string[] args)
         {
             Console.WriteLine("服务器");
            Client= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            IPEndPoint port = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[1], 3000);
            Client.Bind(port);
            Client.Listen(10);
             //开启监听线程;
            accepteThread = new Thread(Accepter);
            accepteThread.IsBackground = true;
            accepteThread.Start();
      
             Console.ReadKey();
         }
         //接收;
       static  private void Reseve(object reseve)
         {
             Socket udpClient = reseve as Socket;
             byte[] bytes = new byte[1024 * 1024];
             int len;
             while (true)
             {
                len= udpClient.Receive(bytes);
                switch (bytes[0])
                { 
                        //假设收到1时会执行一个耗时操作;
                    case 1:
                        for (int i = 0; i <1000;i++ )
                        {
                            Console.WriteLine("处理数据中.....");
                        }
                        break;
                    default:
                        //收到其他数据就转换成字符串输出;
                        string msg = System.Text.Encoding.UTF8.GetString(bytes,0,len);
                        Console.WriteLine(msg);
                        Console.ReadKey();
                        break;
                }
             }
         }
         //监听;
       static void Accepter()
       {
          socket= Client.Accept();
           //开启接收线程;
          reseveThread = new Thread(Reseve);
          reseveThread.IsBackground = true;
          reseveThread.Start(socket);
       }
     }
 }奇怪的是,用UDP发送就不存在这种问题。但是TCP就会出问题; 
http://bbs.csdn.net/topics/390344671

解决方案 »

  1.   

    因为你接受方的代码有误。你可以想象TCP连接象是一个水管,发送方可以一次性倒一桶水,也可以分几瓢灌入。
    接受方在水管的另一端,并不知道对方灌水方式,甚至不知道对方是否已经灌完了(除非一方开始拆管了)。也就是说,你代码中发送方发了两次数据,但对接受方来说,可能只收到一次数据(这时1和'Hello World'可能连在一起),也可能理论上超过两次才收完。很明显接受方的代码没有处理这些情况(你代码中看到1,就不处理后面可能的数据了)。至于UDP不存在这种问题,是因为UDP是基于包传送的。客户发的每个包,服务要么没收到,要么整包收到。
      

  2.   

    呢要如何解决这种问题呢?不论是开线程还是干啥我收到数据总要处理。处理的时候就没法继续接受数据。如何避免这种情况呢? 而且就算不处理 WHile True也是无法避免的,要跳来跳去的,只要不Receve了远程发送过来的数据是不是就丢失了?