我做了个tcp接收和发送的小程序,接收程序总是接收一次,要close,不然就一直白屏,看不到接收的数据,程序如下,帮忙分析下:send:
        Socket s;
        System.Net.Sockets.TcpListener listener = new TcpListener(8005);   
        private void button1_Click(object sender, EventArgs e)
        {
            byte[] bytes = new byte[256];
            int bytelen = 0;
            string a = "aaa"; 
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAddress = IPAddress.Parse("192.168.0.198"); //Dns.Resolve("www.contoso.com").AddressList[0];
            IPEndPoint ipRemoteEndPoint = new IPEndPoint(ipAddress, 8005);            //Serializes the IPEndPoint. 
            SocketAddress socketAddress = ipRemoteEndPoint.Serialize();
            IPAddress ipAddressL = IPAddress.Parse("192.168.0.198"); //Dns.Resolve("www.contoso.com").AddressList[0];
            IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddressL, 8100);            try
            {
                s.Connect(ipRemoteEndPoint);
                //s.Bind(s.LocalEndPoint);
                //s.Bind((EndPoint)ipLocalEndPoint);                bytes = System.Text.Encoding.Default.GetBytes(a);//string.Buffer.GetByte(a,0);
                bytelen = bytes.Length;
                s.Send(bytes,bytelen,SocketFlags.None);
                //s.Close();
            }catch(Exception e1){
                MessageBox.Show(e1.ToString());
            
            }
             
        }recieve:
        private void button2_Click(object sender, EventArgs e)
        {
            int cflag=5;
            int recv;
            byte[] bytes = new byte[256];
            /*try { 
                listener.Start();
            
            }
            catch(Exception e1){
                return;
            
            }*/
            s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           // IPAddress ipAddress = IPAddress.Parse(IPAddress.Any.ToString());
            IPAddress ipAddress = IPAddress.Parse("192.168.0.198");
            IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8005);
            // if(listener.res){}
            //s.Connect(new IPEndPoint(IPAddress.Any, 0));
            s.Bind(ipLocalEndPoint);
            //IPAddress.Parse(CType(s.LocalEndPoint, IPEndPoint).Address.ToString());
            //s.Connect(ipLocalEndPoint);
            s.Listen(cflag);
            //listener.AcceptSocket();
            //while (true)
           // {                
                Select();
                Socket client = s.Accept();
                /*IPAddress ipAddress1 = IPAddress.Parse("192.168.0.181"); //Dns.Resolve("www.contoso.com").AddressList[0];
                IPEndPoint ipRemoteEndPoint = new IPEndPoint(ipAddress1, 8005);
                IPEndPoint clientip = (IPEndPoint)ipRemoteEndPoint;*/                string b = "Server Send...";
                bytes = Encoding.ASCII.GetBytes(b);                client.Send(bytes, b.Length, SocketFlags.None);                //while(true){
                byte[] data = new byte[256];
                recv = client.Receive(data);
                //s.Receive(bytes);
                // if (recv == 0) { break; }                richTextBox1.Text = System.Text.Encoding.Default.GetString(data); //bytes.ToString();
                //client.Send(data,recv,SocketFlags.None);
                            // }
                client.Close();
          //  }
            s.Close();
            
            //s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //IPAddress ipAddress = IPAddress.Parse("192.168.0.198");
            //IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 8001);            //Serializes the IPEndPoint. 
            //SocketAddress socketAddress = ipLocalEndPoint.Serialize();
        }

解决方案 »

  1.   

    好乱啊。。
     //while(true){
      byte[] data = new byte[256];
      recv = client.Receive(data);
      //s.Receive(bytes);
      // if (recv == 0) { break; }你这接收只收了一次 得开启循环
      

  2.   

    好好看看socket基础。阻塞、非阻塞、同步、异步
      

  3.   

                  还有你的发送(send)也得用while循环;发送、接受 都要用while循环,要配套使用!
      

  4.   

    接收的程序放在线程中处理或者TICKER中去,没有一直处理端口哪来收到的信息。
      

  5.   

    可以把 发送文字 放在textBox里,每次发送就调用事件 读取发送文本的字节流,并写入缓存;
    接受时把缓存里字节流读出来,追加到空白字符串末尾,最后显示字符串,就可实现重复发送重复读取;