private void StartListen()
        {
            int port = 5000;
            TcpListener myTcpListener = new TcpListener(port);
            myTcpListener.Start();
            ReceiveSocket = myTcpListener.AcceptSocket();//监听已建立
            this.Receive();
        }        private void Receive()
        {
            try
            {
                while (true)
                {
                    if (ReceiveSocket.Connected)
                    {
                        NetworkStream = new NetworkStream(ReceiveSocket);
                        byte[] data = new byte[512];
                        byte[] buf = new byte[1];
                        buf[0] = 124;
                        NetworkStream.Read(data, 0, data.Length);
                        Msg = Encoding.UTF8.GetString(data);                        string Friends = Fs.getUserFriend(Convert.ToInt32(Msg));
                        string[] FriendArray = Friends.Split('|');
                        Friend.Model fm;
                        foreach (string D in FriendArray)
                        {
                            fm = new Friend.Model();
                            fm.UID = Convert.ToInt32(D);
                            fm.UserName = Us.getUserName(Convert.ToInt32(D));
                            data=Serialize.Serializer.ObjectToByte(fm);
                            NetworkStream.Write(data, 0, data.Length);
                        }
                        NetworkStream.Write(buf, 0, buf.Length);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }上面的代码放在StartListen.aspx.cs文件中,通过浏览器访问这个页面实现监听。但为什么会出现这种情况

解决方案 »

  1.   

    把代码改成了private void StartListen()
            {
                int port = 5000;
                TcpListener myTcpListener = new TcpListener(port);
                myTcpListener.Start();
                ReceiveSocket = myTcpListener.AcceptSocket();//监听已建立
                this.Receive();
            }        private void Receive()
            {
                try
                {
                    while (true)
                    {
                        if (ReceiveSocket.Connected)
                        {
                            NetworkStream = new NetworkStream(ReceiveSocket);
                            byte[] data = new byte[512];
                            byte[] buf = new byte[1];
                            buf[0] = 124;
                            NetworkStream.Read(data, 0, data.Length);
                            Msg = Encoding.UTF8.GetString(data);                        string Friends = Fs.getUserFriend(Convert.ToInt32(Msg));
                            string[] FriendArray = Friends.Split('|');
                            Friend.Model fm;
                            foreach (string D in FriendArray)
                            {
                                fm = new Friend.Model();
                                fm.UID = Convert.ToInt32(D);
                                fm.UserName = Us.getUserName(Convert.ToInt32(D));
                                data=Serialize.Serializer.ObjectToByte(fm);
                                NetworkStream.Write(data, 0, data.Length);
                            }
                            NetworkStream.Write(buf, 0, buf.Length);
                            ReceiveSocket.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }红色部分是修改的部分,但仍然这样我的本意是在服务器端用一个socket监听所有客户端连接,一个客户端连接之后发送数据,发送完成之后继续接收下一个客户端的连接,而不是新开一个监听端口这到底要怎么弄才行?
      

  2.   

    public void CreatSocket()
        {
            try
            {
                int port = 2000;
                string host = "127.0.0.1";
                /**/
                ///创建终结点(EndPoint)  
                IPAddress ip = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例  
                IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例                  /**/            ///创建socket并开始监听 
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字              s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址) 
                s.Listen(0);//开始监听  
                Console.WriteLine("等待客户端连接");
                /**/            ///接受到client连接,为此连接建立新的socket,并接受信息  
                while (true)//定义循环,以便可以简历N次连接  
                {
                    Socket temp = s.Accept();//为新建连接创建新的socket  
                    //Console.WriteLine("建立连接");  
                    string recvStr = "";
                    byte[] recvBytes = new byte[1024];
                    int bytes;
                    bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息  
                    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                    DBHelper.ExecutCommand("INSERT INTO [ShuJu]([strs_VAR]) VALUES('" + recvStr + "')");//存入数据库  
                    if (temp != null)                    temp.Close();
                }            /**/
                ///给client端返回信息  
                //Console.WriteLine("server get message:{0}", recvStr);//把客户端传来的信息显示出来  
                //string sendStr = "ok!Client send message successful!";  
                //byte[] bs = Encoding.ASCII.GetBytes(sendStr);  
                //temp.Send(bs, bs.Length, 0);//返回信息给客户端  
                //temp.Close();  
                s.Close();
                //Console.ReadLine();  
            }
            catch (Exception ex)
            {
                string s = ex.ToString();
            }    }调用
    void Application_Start(object sender, EventArgs e)   
         {           
           // 在应用程序启动时运行的代码  
             (new System.Threading.Thread(new System.Threading.ThreadStart( new Class1().CreatSocket))).Start();//开辟一个新线程  
          }