客户端:
  private void pictureBox3_Click(object sender, EventArgs e)
        {
            try
            {
                int serverhost_port = Convert.ToInt32(Settings.setting_textBox3);
                string serverhost_ip = Settings.setting_textBox2; 
                IPAddress client_ip = IPAddress.Parse(serverhost_ip);
                IPEndPoint client_ipe = new IPEndPoint(client_ip, serverhost_port);
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect(client_ipe);
                string client_sendStr = "";
                if (BuytextBox.Text.Length == 0)
                {                }
                else
                {
                    client_sendStr = Settings.setting_textBox4 + BuytextBox.Text;
                }
                byte[] client_sendbytes = Encoding.UTF8.GetBytes(client_sendStr);
                client.Send(client_sendbytes);
                string client_recvStr = "";
                byte[] client_recvBytes = new byte[1024];
                int bytes;
                bytes = client.Receive(client_recvBytes);//接收数据,并将数据存入接收缓冲区。
                client_recvStr += Encoding.UTF8.GetString(client_recvBytes);
                if(bytes != 0)
                   {                       MessageBox.Show(client_recvStr);
                   }
                client.Close();
            }
            catch (ArgumentNullException es)
            {
                Console.WriteLine("ArgumentNullException: {0}", es);
            }
            catch (SocketException es)
            {
                Console.WriteLine("SocketException: {0}", es);
            }
            Console.ReadLine();
        }客户端:
 delegate void setText();//定义一个线程委托        private void button2_Click(object sender, EventArgs e)
        {
            Thread demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
            demoThread.Start();
        }
        private void ThreadProcSafe()
        {
            setText d = new setText(Threading); //实例化一个委托
            this.Invoke(d);  //在拥用此控件的基础窗体句柄的线程上执行指定的委托
        }
        public void Threading()
        {
            try
                {
                    int server_port = 12345;
                    string server_ip = GetLocalIp();
                    IPAddress localhost_ip = IPAddress.Parse(GetLocalIp());//将 IP 地址字符串转换为 IPAddress 实例
                    IPEndPoint server_ipe = new IPEndPoint(localhost_ip, server_port);//将网络端点表示为 IP 地址和端口号。
                    Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    server_socket.Bind(server_ipe);//绑定
                    server_socket.Listen(50);//参数指定队列中最多可容纳的等待接受的传入连接
                    Socket temp = server_socket.Accept();
                    clientip = (IPEndPoint)temp.RemoteEndPoint;
                    string recvStr = "";
                    byte[] recvBytes = new byte[1024*8];
                    int bytes;
                    bytes = temp.Receive(recvBytes);// 接收指定字节数的数据,并将数据存入接收缓冲区。
                    MessageBox.Show("hello"+ bytes);
                    recvStr = Encoding.UTF8.GetString(recvBytes);
                    textBox1.Text += recvStr;
                    textBox1.Text += System.Environment.NewLine;
                    textBox1.Update();
                    BeepUp.Beep(500, 700);
                    this.BringToFront();
                    this.Focus();
                    temp.Close();
                }
                catch (ArgumentNullException es)
                {
                    Console.WriteLine("ArgumentNullException: {0}", es);
                }
                catch (SocketException es)
                {
                    Console.WriteLine("SocketException: {0}", es);
                }
                Console.ReadLine();
           }

解决方案 »

  1.   

    都temp.Close()了 还怎么第二次 重新建立连接吧
      

  2.   

    每次点击,触发应该都会重新建立连接啊,即便我去掉Close()还是只有第一次行,第二次就无法响应了。多谢回答。
      

  3.   

    如果不希望每次都要触发才能接收应如何修改?即只点击一次“监听”按钮,系统始终进行监听,有内容则添加至textBox1.Text???
      

  4.   

    Socket temp = server_socket.Accept();
    执行完就没了循环 Accept 主线程执行要用异步 否则会界面假死
    AcceptAsync在回调函数里再次托管 达到循环目的或者在单独线程里  while true 
    server_socket.Accept()
    end while