!!!奇怪!!! 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#