public void control()
{
   if(msgs!="")
   {
     ListView.Items.Add(msgs);  
   }
}

解决方案 »

  1.   

    每读取一行的话MSGS都为不为空呀!
    假如你只想出现一次的话定义个静态变量!
    当它为1的时候弹出对话框!否则不弹出!
     if(msgs!="" && count == 1)
       {
          MessageBox.Show(msgs);
       }
      

  2.   

    那么也就是说在netstream--ns中会一直存在数据??
      

  3.   


    ns=new NetworkStream(socketForClient);
    sr=new StreamReader(ns);这两句不应放在while里面,如果你放在里面,每次都会是新的netWorkStream
    新的StreamReader,这无法确定位置(NetworkStream.Position)。这里好像有逻辑矛盾,sr.Readline()是每当发现读到的byte[]里面有1310(\r\n),就往下执行,剩下的循环再读,如果接收的byte[]有多句话(many (\r\n 1310),自然要出现与之相当的对话框。如果要读一句就停止就把对话框写在同一个线程里面,这个线程就会在此停止(注意:这不是主线程,对话框不是用户必须填的,如果用户不理会,此线程会停在这里面,停时间长会使网络断开!)。所以我认为这要重新设计。可以考虑用异步方法(aSynchronous Programming)。
      

  4.   

    如果要实现接受的话,其实没有必要让两个线程来同时运行,最好的方式还是多写一个类,在子类中定义事件,如果读到一行数据激发事件调用父类的处理函数进行处理,也就是在你的程序中把
        while(true)
        {
    ns=new NetworkStream(socketForClient);
    sr=new StreamReader(ns);
    msgs=sr.ReadLine();
         }
    放到子类的方法中去,socket作为参数传给子类,在子类中用
    public deleget void GetData(object sender,string msg);
    public event GetData OnGetData;
    定义事件,然后通过执行OnGetData(object sender,msgs)来激发事件。public void control()
    {
       if(msgs!="")
       {
          MessageBox.Show(msgs);
       }
    }
    这个函数用来处理数据,在调用子类前首先定义子类的事件的委托到这个函数即可实现
      

  5.   

    我一直搞不清楚:
    public void listening()
    {
        TcpListener li=new TcpListener(516);
        li.Start();
        socketForClient=li.AcceptSocket();
        while(true)
        {
    ns=new NetworkStream(socketForClient);
    sr=new StreamReader(ns);
    msgs=sr.ReadLine();
         }
    }
    那么当ns中只有一行的时候可以用sr读,如果有多行的话呢?
    还有就是ns这个网络流是会自动close()的吗,还是一直存在的?
    对不起,我写成
    public void listening()
    {
        TcpListener li=new TcpListener(516);
        li.Start();
        while(true)
        { socketForClient=li.AcceptSocket();
    ns=new NetworkStream(socketForClient);
    sr=new StreamReader(ns);
    msgs=sr.ReadLine();
         }
    }
    是为了多用户接入.