⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex-21-12

📁 Programming Csharp Source Code(代码) Programming Csharp Source Code
💻
字号:
// Example 21-12: Implementing an asynchronous network file server

using System;
using System.Net.Sockets;
using System.Text;
using System.IO;

// get a file name from the client
// open the file and send the
// contents from the server to the client
public class AsynchNetworkFileServer
{
  
   class ClientHandler
   {
      // constructor
      public ClientHandler( 
         Socket socketForClient )
      {
         // initialize member variable
         socket = socketForClient;

         // initialize buffer to hold
         // contents of file
         buffer = new byte[256];

         // create the network stream
         networkStream = 
            new NetworkStream(socketForClient);

         // set the file callback for reading
         // the file
         myFileCallBack = 
            new AsyncCallback(this.OnFileCompletedRead);

         // set the callback for reading from the 
         // network stream
         callbackRead =
            new AsyncCallback(this.OnReadComplete);

         // set the callback for writing to the
         // network stream
         callbackWrite =
            new AsyncCallback(this.OnWriteComplete);
      }

      // begin reading the string from the client
      public void StartRead()
      {
         // read from the network
         // get a filename
         networkStream.BeginRead(
            buffer, 0, buffer.Length, 
            callbackRead, null);
      }

      // when called back by the read, display the string
      // and echo it back to the client
      private void OnReadComplete( IAsyncResult ar )
      {
         int bytesRead = networkStream.EndRead(ar);

         // if you got a string
         if( bytesRead > 0 )
         {
            // turn the string to a file name
            string fileName = 
               System.Text.Encoding.ASCII.GetString(
               buffer, 0, bytesRead);

            // update the console
            Console.Write( 
               "Opening file {0}", fileName);

            // open the file input stream
            inputStream = 
               File.OpenRead(fileName);

            // begin reading the file
            inputStream.BeginRead(
               buffer,             // holds the results
               0,                  // offset
               buffer.Length,      // BufferSize
               myFileCallBack,     // call back delegate
               null);              // local state object

         }
         else
         {
            Console.WriteLine( "Read connection dropped");
            networkStream.Close();
            socket.Close();
            networkStream = null;
            socket = null;
         }
      }

      // when you have a buffer-full of the file
      void OnFileCompletedRead(IAsyncResult asyncResult)
      {
         int bytesRead = 
            inputStream.EndRead(asyncResult);

         // if you read some file
         if (bytesRead > 0)
         {
            // write it out to the client
            networkStream.BeginWrite(
               buffer, 0, bytesRead, callbackWrite, null);
         }
      }


      // after writing the string, get more of the file
      private void OnWriteComplete( IAsyncResult ar )
      {
         networkStream.EndWrite(ar);
         Console.WriteLine( "Write complete");

         // begin reading more of the file
         inputStream.BeginRead(
            buffer,             // holds the results
            0,                  // offset
            buffer.Length,      // (BufferSize)
            myFileCallBack,         // call back delegate
            null);              // local state object

      }

      private const int       BufferSize = 256;
      private byte[]          buffer;
      private Socket          socket;
      private NetworkStream   networkStream;
      private Stream          inputStream;
      private AsyncCallback   callbackRead;
      private AsyncCallback   callbackWrite;
      private AsyncCallback   myFileCallBack; 


   }


   public static void Main()
   {
      AsynchNetworkFileServer app = 
         new AsynchNetworkFileServer();
      app.Run();
   }

   private void Run()
   {
      // create a new TcpListener and start it up
      // listening on port 65000
      TcpListener tcpListener = new TcpListener(65000);
      tcpListener.Start();       

      // keep listening until you send the file
      for (;;)
      {
         // if a client connects, accept the connection
         // and return a new socket named socketForClient
         // while tcpListener keeps listening
         Socket socketForClient = 
            tcpListener.AcceptSocket();
         if (socketForClient.Connected)
         {
            Console.WriteLine("Client connected");
            ClientHandler handler = 
               new ClientHandler(socketForClient);
            handler.StartRead();
         }
      }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -