客户端1s发送一次信息,后面的信息都没有收到。服务器端代码如下
  public partial class Form1 : Form
    {
         
        
        private IPAddress serverIP = IPAddress.Parse("127.0.0.1");//以本机作测试        private IPEndPoint serverFullAddr;//完整终端地址
        private Socket sock;
        Thread myThead = null;
        public Form1()
        {
            InitializeComponent();
        }
        //启动
        private void btnConn_Click(object sender, EventArgs e)
        {
            myThead = new Thread(new ThreadStart(BeginListen));
            myThead.Start();
            btnStart.Enabled = false;
            btnstop.Enabled = true;        }
        private void BeginListen()
        {
            serverIP = IPAddress.Parse(tbxIP.Text);   //IP
            serverFullAddr = new IPEndPoint(serverIP, int.Parse(tbxPort.Text));//设置IP,端口
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //指定本地主机地址和端口号
            sock.Bind(serverFullAddr);
            lbxMessage.Invoke(new SetTextCallback(SetText), "启动成功 时间:" + DateTime.Now, 1);
            byte[] message = new byte[1024];
            string mess = "";
            while (true)
            {
                try
                {
                    sock.Listen(5);//设置监听频率
                    Socket newSocket = sock.Accept();//阻塞方式
                    int bytes = newSocket.Receive(message);//接收数据
                    mess = Encoding.Default .GetString(message, 0, bytes);//对接收字节编码

解决方案 »

  1.   

    只收一次是因为accept阻塞了
    直到有新的连接请求的时候程序才会执行下一句。要避免阻塞,推荐使用异步方式
      
       IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);        
         Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
         socket.Bind(localEndPoint);       
         socket.Listen(20);         
         //启动异步Accept        
         socket.BeginAccept(AcceptCallBack, socket);     
     
         //异步接收回调
         void AcceptCallBack(IAsyncResult ar)    
         { 
            Socket socket = ar.AsyncState as Socket        //结束异步Accept并获已连接的Socket        
            Socket connection = socket.EndAccept(ar);      // 通过connection收发操作的代码略……                 
           
            //继续异步Accept,保证可以Accept后续的接入
            socket.BeginAccept(AcceptCallBack, socket);     
         } 
      

  2.   

    https://download.csdn.net/download/xian_wwq/9636584
      

  3.   

    Socket.Select 解决 Socket 并发通讯问题的利器
    实践证明。他是最佳的手段,虽然 C# 为了推 WCF 有意隐藏了他的作用(WCF 内部可能也是用的他)
      

  4.   

    我的博客被关闭了,不然可以发一个完整的socket通信息完整项目,
      

  5.   

    从你的代码                    sock.Listen(5);//设置监听频率
                        Socket newSocket = sock.Accept();//阻塞方式
                        int bytes = newSocket.Receive(message);//接收数据
                        mess = Encoding.Default .GetString(message, 0, bytes);//对接收字节编码明显地就是,先阻塞 Accept,然后阻塞 Receive,然后不管分包、粘包就当作 messages 中已经完整信息。这三个处理逻辑都不行。
      

  6.   


    现在开通了,地址https://blog.csdn.net/xuelin663