Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

c# ile Açılan soket ile zaten bağlı olan bir istemciye, biz istediğimiz zaman veri yollayabilir miyiz?

Program soket açarak istemcileri dinliyor. İstemci veri yollayınca karşılık olarak cevap bilgisi yollanıyor (satır 210).
Açılan soket ile zaten bağlı olan bir istemciye, biz istediğimiz zaman veri yollayabilir miyiz?

Alıntı yapılan kodlar:

Kullanılan kodların alındığı adres:
http://www.codeproject.com/Articles/2866/Multi-threaded-NET-TCP-Server-Examples


using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Collections;
using System.Threading;
 
 
class ClientConnectionPool {
        // Creates a synchronized wrapper around the Queue.
        private  Queue SyncdQ = Queue.Synchronized( new Queue() );
     
        public  void Enqueue(ClientHandler client) {
                SyncdQ.Enqueue(client) ;
        }
       
        public  ClientHandler Dequeue() {
                return (ClientHandler) ( SyncdQ.Dequeue() ) ;
        }
       
        public  int Count {
                get { return SyncdQ.Count ; }
        }
 
        public object SyncRoot {
      get { return SyncdQ.SyncRoot ; }
        }
       
} // class ClientConnectionPool
       
class ClientService {
       
        const int NUM_OF_THREAD = 10;
       
        private ClientConnectionPool ConnectionPool  ;
        private bool ContinueProcess = false ;
        private Thread [] ThreadTask  = new Thread[NUM_OF_THREAD]  ;
     
        public ClientService(ClientConnectionPool ConnectionPool) {
                this .ConnectionPool = ConnectionPool ;
        }        
 
        public void Start() {
                ContinueProcess = true ;
                // Start threads to handle Client Task
                for ( int i = 0 ; i < ThreadTask.Length ; i++) {
                        ThreadTask[i] = new Thread( new ThreadStart(this.Process) );
                        ThreadTask[i].Start() ;
                }
        }
       
        private  void Process()  {
                while ( ContinueProcess ) {
 
               ClientHandler client  = null ;
                         lock( ConnectionPool.SyncRoot ) {
           if  ( ConnectionPool.Count > 0 )
                                client = ConnectionPool.Dequeue() ;
               }                                 
                         if ( client != null ) {
                            client.Process() ; // Provoke client
                        // if client still connect, schedufor later processingle it
                            if ( client.Alive )
                            ConnectionPool.Enqueue(client) ;
                         }
                       
                        Thread.Sleep(100) ;
                }        
        }
       
        public  void Stop() {
                ContinueProcess = false ;        
                for ( int i = 0 ; i < ThreadTask.Length ; i++) {
                        if ( ThreadTask[i] != null &&  ThreadTask[i].IsAlive )  
                                ThreadTask[i].Join() ;
                }
                       
                // Close all client connections
                while ( ConnectionPool.Count > 0 ) {
                        ClientHandler client = ConnectionPool.Dequeue() ;
                        client.Close() ;
                        Console.WriteLine("Client connection is closed!") ;
                }
        }
       
} // class ClientService
 
public  class SynchronousSocketListener {
       
  private  const int  portNum = 10116 ;
 
  public  static  void StartListening() {
 
        ClientService ClientTask  ;
       
        // Client Connections Pool
        ClientConnectionPool ConnectionPool = new ClientConnectionPool()  ;          
       
        // Client Task to handle client requests
        ClientTask = new ClientService(ConnectionPool) ;
       
        ClientTask.Start() ;
   
        TcpListener listener = new TcpListener(portNum);
        try {
              listener.Start();
       
              int TestingCycle = 3 ; // Number of testing cycles
              int ClientNbr = 0 ;
       
              // Start listening for connections.
              Console.WriteLine("Waiting for a connection...");
              while ( TestingCycle > 0 ) {
                     
                        TcpClient handler = listener.AcceptTcpClient();
                       
                        if (  handler != null)  {
                                Console.WriteLine("Client#{0} accepted!", ++ClientNbr) ;
                               
                                // An incoming connection needs to be processed.
                                ConnectionPool.Enqueue( new ClientHandler(handler) ) ;
                               
                                --TestingCycle ;
                        }
                        else
                                break;                
              }
              listener.Stop();
             
              // Stop client requests handling
              ClientTask.Stop() ;
             
             
        } catch (Exception e) {
              Console.WriteLine(e.ToString());
        }
       
        Console.WriteLine("\nHit enter to continue...");
        Console.Read();
  }
 
 
  public  static  int Main(String[] args) {
        StartListening();
        return 0;
  }
}
 
 
class ClientHandler {
 
    private TcpClient ClientSocket ;
            private NetworkStream networkStream ;
    bool ContinueProcess = false ;
            private byte[] bytes;       // Data buffer for incoming data.
            private StringBuilder sb =  new StringBuilder(); // Received data string.
    private string data = null; // Incoming data from the client.
 
    public ClientHandler (TcpClient ClientSocket) {
        ClientSocket.ReceiveTimeout = 100 ; // 100 miliseconds
        this.ClientSocket = ClientSocket ;
                    networkStream = ClientSocket.GetStream();
                    bytes = new byte[ClientSocket.ReceiveBufferSize];
                    ContinueProcess = true ;
    }
 
    public  void Process() {
 
                            try {
                                int BytesRead = networkStream.Read(bytes, 0, (int) bytes.Length);
                                if ( BytesRead > 0 )
                                // There might be more data, so store the data received so far.
                                        sb.Append(Encoding.ASCII.GetString(bytes, 0, BytesRead));  
                               else
                               // All the data has arrived; put it in response.
                                        ProcessDataReceived() ;
                               
                            }                        
                            catch  ( IOException ) {
                                // All the data has arrived; put it in response.
                                ProcessDataReceived() ;
                            }    
                            catch  ( SocketException ) {
                                networkStream.Close() ;
                              ClientSocket.Close();        
                                ContinueProcess = false ;
                                Console.WriteLine( "Conection is broken!");
                            }                
 
    }  // Process()
 
        private void ProcessDataReceived() {
                if ( sb.Length > 0 ) {
        bool bQuit = ( String.Compare( sb.ToString(),  "quit", true ) == 0 ) ;
 
        data = sb.ToString() ;
                                   
                            sb.Length  =  0 ; // Clear buffer
 
        Console.WriteLine( "Text received from client:") ;
                            Console.WriteLine(data) ;
       
        StringBuilder response = new StringBuilder(  ) ;
        response.Append( "Received at " ) ;
        response.Append( DateTime.Now.ToString() ) ;
        response.Append( "\r\n" ) ;
        response.Append( data ) ;
 
                    // Echo the data back to the client.
                            byte[] sendBytes = Encoding.ASCII.GetBytes(response.ToString());
                            networkStream.Write(sendBytes, 0, sendBytes.Length);
       
                    // Client stop processing  
                            if ( bQuit  )  {
                                    networkStream.Close() ;
                                    ClientSocket.Close();  
                                    ContinueProcess = false ;
                            }
                }
        }        
       
        public void Close() {
                networkStream.Close() ;
                ClientSocket.Close();        
        }
       
        public  bool Alive {
                get {
                        return  ContinueProcess ;
                }
        }
       
} // class ClientHandler
 

+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Cevaplar

Hiç cevap bulunamadı. İlk cevabı siz yazın.