我在msdn上编写了读写函数,如下
public void NetRead()
        {
            NetworkStream myNetworkStream = NetClient.GetStream();            if (myNetworkStream.CanRead)
            {
                byte[] myReadBuffer = new byte[1024];
                StringBuilder myCompleteMessage = new StringBuilder();
                int numberOfBytesRead = 0;
                // Incoming message may be larger than the buffer size.
                do
                {
                    numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                    myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                }
                while (myNetworkStream.DataAvailable);
                // Print out the received message to the console.
                Console.WriteLine("You received the following message : " +
                                             myCompleteMessage);
                //NetRead();
            }
            else
            {
                Console.WriteLine("Sorry.  You cannot read from this NetworkStream.");
            }
        }
        
        public void NetWrite()
        {
            NetworkStream myNetworkStream = NetClient.GetStream();            if (myNetworkStream.CanWrite)
            {
                byte[] myWriteBuffer = Encoding.ASCII.GetBytes("Are you receiving this message?");
                myNetworkStream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
            }
            else
            {
                Console.WriteLine("Sorry.  You cannot write to this NetworkStream.");
            }
        }
问题是:
我的读函数怎样才能一直监听设备呢?而不是每次调用?用线程?还是我理解错了,他一直在监听?谢谢!
或者哪位高手有通讯的例子就最好了。

解决方案 »

  1.   


    //client端
    usingSystem;
    usingSystem.Text;
    usingSystem.IO;
    usingSystem.Net;
    usingSystem.Net.Sockets;
    namespacesocketsample
    {
      classClass1
      {
       staticvoidMain()
       {
        try
        {
         intport=2000;
         stringhost="127.0.0.1";
         IPAddressip=IPAddress.Parse(host);
         IPEndPointipe=newIPEndPoint(ip,port);//把ip和端口转化为IPEndPoint实例
         Socketc=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建一个Socket
         Console.WriteLine("Conneting...");
         c.Connect(ipe);//连接到服务器
         stringsendStr="hello!Thisisasockettest";
         byte[]bs=Encoding.ASCII.GetBytes(sendStr);
         Console.WriteLine("SendMessage");
         c.Send(bs,bs.Length,0);//发送测试信息
         stringrecvStr="";
         byte[]recvBytes=newbyte[1024];
         intbytes;
         bytes=c.Receive(recvBytes,recvBytes.Length,0);//从服务器端接受返回信息
         recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
         Console.WriteLine("ClientGetMessage:{0}",recvStr);//显示服务器返回信息
         c.Close();
        }
        catch(ArgumentNullExceptione)
        {
         Console.WriteLine("ArgumentNullException:{0}",e);
        }
        catch(SocketExceptione)
        {
         Console.WriteLine("SocketException:{0}",e);
        }
        Console.WriteLine("PressEntertoExit");
        Console.ReadLine();
       }
      }
    }//server端
    usingSystem;
    usingSystem.Text;
    usingSystem.IO;
    usingSystem.Net;
    usingSystem.Net.Sockets;
    namespaceProject1
    {
      classClass2
      {
       staticvoidMain()
       {
        try
        {
         intport=2000;
         stringhost="127.0.0.1";
         IPAddressip=IPAddress.Parse(host);
         IPEndPointipe=newIPEndPoint(ip,port);
         Sockets=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建一个Socket类
         s.Bind(ipe);//绑定2000端口
         s.Listen(0);//开始监听
         Console.WriteLine("Waitforconnect");
         Sockettemp=s.Accept();//为新建连接创建新的Socket。
         Console.WriteLine("Getaconnect");
         stringrecvStr="";
         byte[]recvBytes=newbyte[1024];
         intbytes;
         bytes=temp.Receive(recvBytes,recvBytes.Length,0);//从客户端接受信息
         recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
         Console.WriteLine("ServerGetMessage:{0}",recvStr);//把客户端传来的信息显示出来
         stringsendStr="Ok!ClientSendMessageSucessful!";
         byte[]bs=Encoding.ASCII.GetBytes(sendStr);
         temp.Send(bs,bs.Length,0);//返回客户端成功信息
         temp.Close();
         s.Close();
        }
        catch(ArgumentNullExceptione)
        {
         Console.WriteLine("ArgumentNullException:{0}",e);
        }
        catch(SocketExceptione)
        {
         Console.WriteLine("SocketException:{0}",e);
        }
        Console.WriteLine("PressEntertoExit");
        Console.ReadLine();
       }
      }
    }
      

  2.   

    或者是:这个相当于是一直在监听的. int port = 5011;
                string host = "127.0.0.1";
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
                s.Bind(ipe);//绑定2000端口
                s.Listen(0);//开始监听     
      Socket temp = s.Accept();//为新建连接创建新的Socket。;            while (true)
                {
                    string recvStr = "";
                    byte[] recvBytes = new byte[1024];
                    int bytes;
                                   bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                    if (bytes==0)
                    {
                        Thread.Sleep(1000);
                        continue;
                    }                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);                if(recvStr=="01")
                    {
                        clsRtSrvobjData cls = new clsRtSrvobjData();
                        cls.Test(1);
                    }            }
      

  3.   

    修改后如下
    public void NetRead()
            {
                NetworkStream myNetworkStream = NetClient.GetStream();
                try
                {
                    if (myNetworkStream.CanRead)
                    {
                        byte[] myReadBuffer = new byte[1024];
                        StringBuilder myCompleteMessage = new StringBuilder();
                        int numberOfBytesRead = 0;
                        // Incoming message may be larger than the buffer size.
                        do
                        {
                            numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                            myCompleteMessage.AppendFormat("{0}", Encoding.Unicode.GetString(myReadBuffer, 0, numberOfBytesRead));
                        }
                        while (myNetworkStream.DataAvailable);
                        // Print out the received message to the console.
                       NetRead();
                    }
                }
                catch (Exception ex)
                {            }
            }
            
            public void NetWrite()
            {
                NetworkStream myNetworkStream = NetClient.GetStream();            if (myNetworkStream.CanWrite)
                {
                    byte[] myWriteBuffer = Encoding.Unicode.GetBytes("客户端: Are you receiving this message?");
                    myNetworkStream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
                }
                else
                {
                    Console.WriteLine("Sorry. You cannot write to this NetworkStream.");
                }
            }其中
                {//可以连接,创建一个线程监听
                    Thread th = new Thread(new ThreadStart(NetRead));
                    th.IsBackground = true;
                    th.Start();                                                                               
                }