服务器端代码如下: [STAThread]
        static void Main()
        {
            videoSettingsManager vsm = new videoSettingsManager();
            videoSettings vs = vsm.getVideoSettings();
           // this.server_time = DateTime.Now.ToString();
            int listenport = 0;
            try
            {
               listenport = int.Parse(vs.EcSystemPort);//从配置文件中读取端口号
            }
            catch (Exception ex) { Console.WriteLine(ex.ToString()); }
            listener = new TcpListener(listenport);
            listener.Start();
            Thread s3 = new Thread(new ThreadStart(ServiceClient));
            s3.Start();
            
        }   public static void ServiceClient()
        {
                            // string recvStr = "";                     while (true)
                {
                   
                    client = listener.Server.Accept();
                        Console.WriteLine("有客户端连接");
                        byte[] recvBytes = new byte[1024];
                        int i = client.Receive(recvBytes, recvBytes.Length, 0);
                        if (i > 0)
                        {
                            string recvStr = Encoding.Default.GetString(recvBytes, 0, i);
                            deviceinfo info = getXML(recvStr);//解析xml(数据库业务)                            
                            if (info.Type == "device")
                            {
                                devicemanager dm = new devicemanager();
                                if (info.Method == "getAllDevice")
                                {
                                    System.Collections.Generic.List<device> arry = dm.getallDevice();
                                    string xml = myXmlSerializer(arry);
                                    client.Send(Encoding.UTF8.GetBytes(xml + "@"));
                                }
                            } 
                            else if (info.Type == "user")
                            {
                                usermanager dm = new usermanager();//解析xml(数据库业务)
                                if (info.Method == "Login")
                                {
                                    string check = dm.Login(info.DbPara1, info.DbPara2);
                                    client.Send(Encoding.UTF8.GetBytes(check));
                                }
                                if (info.Method == "getallUser")
                                {
                                    List<user> arry = dm.getallUser();
                                    string xml = myXmlSerializer(arry);
                                    client.Send(Encoding.UTF8.GetBytes(xml + "@"));
                                }
                             }
                            else if (info.Type == "ExitSys")
                            {
                                client.Close();
                            }                        }
                       
                    //}
                    
              
                }                    }当客户端向服务器发送消息时,第一次可以收到,第二次发送消息的时候,服务器端接收不到,我并没有断开连接。。不知道什么问题,高手指教。偶是新手!!!!

解决方案 »

  1.   

    int i = client.Receive(recvBytes, recvBytes.Length, 0); 
    ---------------
    client.Receive这个方法要循环接收每一次的信息,你这里只有监听的循环,而client只接收了一次。你的程序结构可能要改一下以便使用client的循环接收。
      

  2.   

    socket一般都要配合线程来用的,需要一直监听端口
    http://blog.csdn.net/lanwilliam/category/389493.aspx
    可以参考我原来搜集的资料
      

  3.   

    服务端的端口其实也不一定要一直监听,它的任务不过是接收来自客户端的连接,如果是长连接的话,客户端一和服务器连接上服务器上就可以一直使用这个Accept后的连接了。只要Accept后的这个连接可以不停的循环读取数据就可以一直和客户端发生交互。
      

  4.   

    hbxtlhx :
    那我应该怎么改呢,客户端要和服务器端交换,当客户端发送某条指令后,服务器根据指令返回信息。
    偶不是搞c#的,以前没搞过socket。请交交我吧,急啊
      

  5.   

    如果客户端是长连接的话,可以在服务器上保持一个连接与其一直通信。
    你可以使用Accept到的Socket做为参数构建一个类,比如如下的语句:AcceptClient acs = new AcceptClient(m_ServerSocket.Accept());
    acs.DoWork();
    这个AcceptClient里有一个方法DoWork(),可以在这个方法里启动一个线程或就是一个循环,或使用BackgroundWorker开启一个异步方法来循环接收。如: public void DoWork()
    {
    m_backWorker = new BackgroundWorker();
    m_backWorker.WorkerSupportsCancellation = true;
    m_backWorker.DoWork += new DoWorkEventHandler(bw_DoWork);
    m_backWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_backWorker_RunWorkerCompleted);
    m_backWorker.RunWorkerAsync();
    }
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
    do
    {
    if (this.m_backWorker.CancellationPending)
    {
    break;
    }
    SocketError se = SocketError.Success; byte[] buffer = new byte[m_BufferSize];
    int bytes = 0;
    try
    {
    bytes = this.m_Socket.Receive(buffer, 0, m_BufferSize, SocketFlags.None, out se);
    }
    catch
    {
    break;
    }
    if (se != SocketError.Success)
    {
    break;
    } if (bytes == 0)
    {
    break;
    }
    }
    while (true);
    }