我的socket服务端用死循环监听,接收到数据的话就起个线程处理数据。这是我的思路。可是我发现当客户端向我的端口发送信息时 我只能接收到第一个数据,要想再次接收时 ,只能客户端与我断开,再连接, 才能接受。不知道哪出问题了

解决方案 »

  1.   

    还有这回事?要是对单客户机的话,根本没有必要用线程啊        private void button1_Click(object sender, EventArgs e)
            {
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
                m_mainsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                m_mainsocket.Bind(ipep);
                m_mainsocket.Listen(10);
                m_mainsocket.BeginAccept(new AsyncCallback(Accept), null);
            }
            void Accept(IAsyncResult iar)
            {
                try
                {
                    m_memsocket[m_clientnum] = m_mainsocket.EndAccept(iar);
                    string str = "connected with" + m_clientnum.ToString() + "#";
                    //
                    label1.Invoke(new myeventhandler(SetLabelText), new object[] { str });
                    waitfordata(m_memsocket[m_clientnum]);
                    //
                    m_clientnum++;
                    m_mainsocket.BeginAccept(new AsyncCallback(Accept), null);
                }
                //
                catch (ObjectDisposedException e)
                {            }
            }
            public class socketpacket
            {
                public Socket m_currentsocket;
                public byte[] data = new byte[1024]; 
            }
            void waitfordata(Socket s)
            {
                socketpacket theSockPkt = new socketpacket();
                theSockPkt.m_currentsocket = s;
                s.BeginReceive(theSockPkt.data, 0, theSockPkt.data.Length, SocketFlags.None, new AsyncCallback(ReceiveData), theSockPkt);        }
            void ReceiveData(IAsyncResult iar)
            {
                socketpacket socketdata = (socketpacket)iar.AsyncState;
                try
                {
                    int recv = socketdata.m_currentsocket.EndReceive(iar);
                                    //listBox1.Items.Add(Encoding.ASCII.GetString(socketdata.data,0,recv));
                    //data process
                    //...
                    //DataProc(socketdata);socketdata.data,socketdata.m_currentsocket;
                    //...
                    //listBox1.Invoke(new myeventhandler(AddListBoxItem), new object[] { Encoding.ASCII.GetString(socketdata.data, 0, recv) });
                }
                catch (SocketException e)
                {
                    return;
                }
                waitfordata(socketdata.m_currentsocket);
            }
      

  2.   

    补充一点,上面那个例子好像是多客户机的?
    俩个成员:
    Socket m_mainsocket;
    Socket[] m_memsocket = new Socket[10];
      

  3.   

    客户端有很多个。。1楼 在哪设置继续接收数据  
               listener.Bind(ipe);
                while (true)
                {
                    listener.Listen(5);
                    Socket handler = listener.Accept();
                    mythread thread = new mythread(handler);
                 }
    这样感觉应该可以了吧
      

  4.   

    你为每个链接新开的线程中应该
    WHILE(true)
    {
        clientSckHandler.Reveice();
    }
    死循环接受数据
      

  5.   

    1个是死循环接受客户端连接
    当1个新的连接进来,为这个连接新开1个线程,在这个线程里面死循环接受数据。
    注意,这里的客户端SOCKET和你的监听的SOCKET不是同一个。
      

  6.   

    建议使用.NET异步SOCKET模型,开多线程这种顶多1000线。(但貌似就算是异步模型这种也上不了10000线)。
    用C++基于完成端口的方式据说可以支持10000线。另外你也要根据你的实际情况来说,说不定你根本不需要长连接这种形式啊。不过上万个用户,说实话,怎么整压力都有点大,你可以采用考虑下实现集群。
      

  7.   

    啊。。每个客户端间隔1~3min发送一次哎。。额滴 神呢。。
      

  8.   

    1-3分发送?那就用短连接就行了。太不频繁了。
    类似于HTTP,连接,发送数据,断开连接