当前位置:编程学习 > C#/ASP.NET >>

!!!奇怪!!! NetworkStream 为什么不阻塞?

    private void doComm(object conn)  //这是线程函数,把socket对象作为参数传递进来
    {
      Socket cn = (Socket)conn;
      cn.Blocking = true; //设置了这个属性还是不阻塞
      NetworkStream stream = new NetworkStream(cn);
      CRecvBuf recvBuf = new CRecvBuf(1000);
      byte[] buf=new byte[1000];
      int n;
      while(true)
      {
        try
        {

          stream.ReadByte(); //这句不阻塞
          n = stream.Read(buf, 0, buf.Length); //这句也不阻塞

          Trace.Write(CCheck.BinaryToHexString(buf, n));
          Trace.WriteLine("n=" + n);
        }
        catch(Exception ex)
        {
          Trace.Write(ex.Message);
          break;
        }
      }  //while循环

    } --------------------编程问答-------------------- 顶一下 --------------------编程问答-------------------- 阻塞不阻塞还要看进行的是什么样的操作,某些操作会阻塞,但有些操作并不会阻塞。 --------------------编程问答-------------------- 我编写的是一个聊天程序的服务器端
什么情况下才会阻塞呢?
ReadByte和Read都不阻塞 --------------------编程问答-------------------- NetworkStream就没有会引起阻塞的操作。
如果调用Socket的一些方法,比如Accept,比如Receive,就会引起阻塞。
这些方法的作用在MSDN都有很明确的说明。 --------------------编程问答-------------------- 用Receive能代NetworkStream 吗,如果能的话,就用Receive了 --------------------编程问答-------------------- 能不能代替还要看你自己。 --------------------编程问答-------------------- Socket的Receive方法还是不行,不阻塞线程 --------------------编程问答--------------------       Socket cn = (Socket)conn;
      cn.Blocking = true;
      byte[] buf=new byte[1000];
      int n;
      while(true)
      {

        n = cn.Receive(buf);
        Trace.WriteLine(n);
      } --------------------编程问答-------------------- 阻塞是什么意思?
有数据立即返回,没有数据,停在那儿等待有数据。 --------------------编程问答-------------------- 就是没有数据时,线程被阻塞,直到有数据到达

串口通信类SerialPort类的ReadByte就是这样 --------------------编程问答-------------------- doComm 大哥这个是新开的线程函数吧 --------------------编程问答-------------------- 那你现在如何判断出它没有阻塞? --------------------编程问答-------------------- doComm 是线程函数
    private void beginListin()
    {
      TcpListener listener = new TcpListener(endpoint);
      listener.Start();
      while (true)
      {
        Socket conn;
        conn = listener.AcceptSocket();
        //conn.Blocking = true;
        Trace.WriteLine("accept!!!");
        ParameterizedThreadStart ts = new ParameterizedThreadStart(doComm);
        Thread t = new Thread(ts);
        t.IsBackground = true;
        t.Start(conn);
      }
    } --------------------编程问答-------------------- 楼上说的对,用到receive, accept会阻塞,就是会一直等待数据进来。

要想不阻塞的话可以用多线程或是异步 --------------------编程问答-------------------- accept是会阻塞,但在收发数据时,用receive不阻塞
郁闷 --------------------编程问答-------------------- 判断阻塞方法很简单,我一直都在打印数据
如果不阻塞,就一直打印,由于没用用sleep,程序很快就会死循环 --------------------编程问答-------------------- 如此看来,Receive不阻塞的原因就是一直有数据进来了,你应该很容易就可以从打印结果中看到的。 --------------------编程问答--------------------         n = cn.Receive(buf);
        Trace.WriteLine(n); 

打印n一直为0呀 --------------------编程问答-------------------- 客户端也是我自己写的,按一下按钮才发数据,不会有数据来 --------------------编程问答-------------------- 对方没有关闭连接的操作吧? --------------------编程问答-------------------- 对方没有关闭连接的操作吧?
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,