Servidor TCP con MultiPhreading -- # campo con multithreading campo con asynchronous campo con socket campo con tcp camp codereview Relacionados El problema

TCP Server with multithreading


2
vote

problema

Español

Estoy trabajando en una solicitud bancaria. Quiero crear un TCP MultiPhReed TCP Tarjeta de pago (ISO8583) servidor que puede manejar solicitudes de impresión de Passbook simultáneamente. Múltiples dispositivos están conectados al servidor desde diferentes ubicaciones.

Voy a usar por debajo del código en mi solicitud. ¿Es seguro este hilo? ¿Puedo enfrentar cualquier problema en el futuro si uso este código? Todas las sugerencias de bienvenida.

  class Program     {          static void Main(string[] args)         {              TcpListener serverSocket = new TcpListener(8888);              TcpClient clientSocket = default(TcpClient);              int counter = 0;                serverSocket.Start();              Console.WriteLine(" >> " + "Server Started");                counter = 0;              while (true)             {                  counter += 1;                  clientSocket = serverSocket.AcceptTcpClient();                  Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");                  handleClinet client = new handleClinet();                  client.startClient(clientSocket, Convert.ToString(counter));              }                clientSocket.Close();              serverSocket.Stop();           //   Console.WriteLine(" >> " + "exit");             Console.ReadLine();          }      }        //Class to handle each client request separatly      public class handleClinet     {          TcpClient clientSocket;          string clNo;          public void startClient(TcpClient inClientSocket, string clineNo)         {              this.clientSocket = inClientSocket;              this.clNo = clineNo;              Thread ctThread = new Thread(doChat);              ctThread.Start();          }          private void doChat()         {              int requestCount = 0;              byte[] bytesFrom = new byte[10025];              string dataFromClient = null;              Byte[] sendBytes = null;              string serverResponse = null;              string rCount = null;              requestCount = 0;                while ((true))             {                  try                 {                     var respose = "";                     requestCount = requestCount + 1;                      NetworkStream networkStream = clientSocket.GetStream();                      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);                      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);                    //  dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));                      Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient);                      try                     {                         var isoPassbookRequestMessage = System.Text.Encoding.ASCII.GetString(bytesFrom);                         WebClient wc = new WebClient();                         NameValueCollection input = new NameValueCollection();                         input.Add("isoPassbookRequest", Convert.ToBase64String(bytesFrom));                         respose = Encoding.ASCII.GetString(wc.UploadValues("http://localhost:52835/Transaction/PassbookTransactionRequest", input));                           try                         {                           //  CommonMethods.AddtoLogFile("PassbookTransactionResponse = Clientid-" + clientID + " ProcessingCode -930000 Message -" + respose);                           //  atmServer.Send(clientID, Encoding.ASCII.GetBytes(respose));                         }                         catch (SocketException se)                         {                              //could not complete transaction                             //Send reversal to CBS                          }                     }                     catch (Exception e)                     {                      }                      rCount = Convert.ToString(requestCount);                     serverResponse = "Server to clinet(" + clNo + ") " + rCount;                       sendBytes = Encoding.ASCII.GetBytes(respose);                      networkStream.Write(sendBytes, 0, sendBytes.Length);                      networkStream.Flush();                      Console.WriteLine(" >> " + serverResponse);                  }                  catch (Exception ex)                 {                      Console.WriteLine(" >> " + ex.ToString());                  }              }          }      }   
Original en ingles

I am working on a banking application. I want to create a multithreaded TCP Payment Card (iso8583) server that can handle passbook printing requests simultaneously. Multiple devices are connected to the server from different locations.

I am going to use below code in my application. Is this thread safe? Can I face any problem in the future if I use this code? All suggestions welcome.

class Program     {          static void Main(string[] args)         {              TcpListener serverSocket = new TcpListener(8888);              TcpClient clientSocket = default(TcpClient);              int counter = 0;                serverSocket.Start();              Console.WriteLine(" >> " + "Server Started");                counter = 0;              while (true)             {                  counter += 1;                  clientSocket = serverSocket.AcceptTcpClient();                  Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");                  handleClinet client = new handleClinet();                  client.startClient(clientSocket, Convert.ToString(counter));              }                clientSocket.Close();              serverSocket.Stop();           //   Console.WriteLine(" >> " + "exit");             Console.ReadLine();          }      }        //Class to handle each client request separatly      public class handleClinet     {          TcpClient clientSocket;          string clNo;          public void startClient(TcpClient inClientSocket, string clineNo)         {              this.clientSocket = inClientSocket;              this.clNo = clineNo;              Thread ctThread = new Thread(doChat);              ctThread.Start();          }          private void doChat()         {              int requestCount = 0;              byte[] bytesFrom = new byte[10025];              string dataFromClient = null;              Byte[] sendBytes = null;              string serverResponse = null;              string rCount = null;              requestCount = 0;                while ((true))             {                  try                 {                     var respose = "";                     requestCount = requestCount + 1;                      NetworkStream networkStream = clientSocket.GetStream();                      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);                      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);                    //  dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));                      Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient);                      try                     {                         var isoPassbookRequestMessage = System.Text.Encoding.ASCII.GetString(bytesFrom);                         WebClient wc = new WebClient();                         NameValueCollection input = new NameValueCollection();                         input.Add("isoPassbookRequest", Convert.ToBase64String(bytesFrom));                         respose = Encoding.ASCII.GetString(wc.UploadValues("http://localhost:52835/Transaction/PassbookTransactionRequest", input));                           try                         {                           //  CommonMethods.AddtoLogFile("PassbookTransactionResponse = Clientid-" + clientID + " ProcessingCode -930000 Message -" + respose);                           //  atmServer.Send(clientID, Encoding.ASCII.GetBytes(respose));                         }                         catch (SocketException se)                         {                              //could not complete transaction                             //Send reversal to CBS                          }                     }                     catch (Exception e)                     {                      }                      rCount = Convert.ToString(requestCount);                     serverResponse = "Server to clinet(" + clNo + ") " + rCount;                       sendBytes = Encoding.ASCII.GetBytes(respose);                      networkStream.Write(sendBytes, 0, sendBytes.Length);                      networkStream.Flush();                      Console.WriteLine(" >> " + serverResponse);                  }                  catch (Exception ex)                 {                      Console.WriteLine(" >> " + ex.ToString());                  }              }          }      } 
              
     
     

Lista de respuestas

4
 
vote

naming y estilo

  • basado en la naming guidrines Los nombres de las clases y los nombres de los métodos deben ser usando PascalCase carcasa.
  • Tienes que un espaciado mucho vertical (nuevas líneas)
  • Se debe eliminar el código muerto
  • Los nombres deben ser deletrados correctamente handleClinet - & gt; & gt; HandleClient o respose - & gt; & gt; response
  • Los nombres de las clases deben hacerse de sustantivos o frases de sustantivos. HandleClient - & gt; ClientHandler

general

  • El constructor de uso TcpListener(Int32) es obsoleto desde la red 3.5
  • Los bloques de prueba vacíos son inútiles y deben eliminarse
  • Los bloques de captura vacíos son peligrosos y deben evitarse. Si realmente necesita tragar una excepción, debe agregar un comentario allí explicando por qué el bloque de captura está vacío.

pequeñas duplicaciones de código

  response.EnsureSuccessStatusCode(); return await response.Content.ReadAsAsync<ApiResult>(); 0  

No se necesita la segunda asignación.

Números mágicos

Tiene al menos un número mágico en su código response.EnsureSuccessStatusCode(); return await response.Content.ReadAsAsync<ApiResult>(); 1 . Debe extraer dichos números mágicos en constantes con nombres significativos.

 

Naming and Style

  • based on the naming guidlines class names and method names should be using PascalCase casing.
  • you have to much vertical spacing (new lines)
  • dead code should be removed
  • names should be spelled correctly handleClinet -> HandleClient or respose-> response
  • class names should be made out of nouns or noun phrases. HandleClient -> ClientHandler

General

  • the use constructor TcpListener(Int32) is obsolete since NET 3.5
  • empty try blocks are useless and should be removed
  • empty catch blocks are dangerous and should be avoided. If you really need to swallow an exception you should add a comment there explaining why the catch block is empty.

Small code duplications

int requestCount = 0; // // requestCount = 0;   

the second assignment is not needed.

Magic numbers

You have at least one magic number in your code byte[10025];. You should extract such magic numbers into constants with meaningful names.

 
 

Relacionados problema

6  Implementación del protocolo, TCP, envío de imágenes a través de sockets - Seguimiento  ( Protocol implementation tcp sending images through sockets follow up ) 
Me gustaría preguntar sobre su opinión sobre mi código. La idea es simple: diseñé mi propio protocolo, donde el cliente le pregunta al servidor sobre la image...

4  Leer y escribir transmisiones TCP  ( Read and write tcp streams ) 
Estoy trabajando en una memoria en la memoria caché de disco y estoy usando TCP para enviar datos entre el cliente y el servidor Las pruebas localmente pare...

12  Asintccclient (tcpclient asíncrono)  ( Asynctcpclient asynchronous tcpclient ) 
He estado haciendo la programación de la red usando C # 's TcpClient Durante varios años. El código a continuación es una envoltura asíncrona para TcpClien...

2  TCP / IP enviando y recibiendo hilos  ( Tcp ip sending and receiving threads ) 
Es mi primera puñalada en TCP / IP y, honestamente, estoy empezando en C # también, por lo que cualquier comentario sobre el diseño, el método, etc. son más q...

4  Sala de chat de zócalo hecha con Tkinter Python  ( Socket chat room made with tkinter python ) 
Esta es una sala de chat real real que he hecho con Tkinter Publiqué una pregunta antes de hacer una sala de chat, pero el problema que tenía con ese era qu...

1  Servidor de eco de Python TCP  ( Python tcp echo server ) 
El siguiente código es un simple servidor TCP ECHO. La gente que usa afirma "Está bajando de vez en cuando de vez en cuando". Cualquier pensamiento sobre cómo...

10  Protocolo de red usando TCP, enviando imágenes a través de sockets  ( Network protocol using tcp sending images through sockets ) 
Me gustaría preguntar sobre su opinión sobre mi código. La idea es simple: diseñé mi propio protocolo, donde el cliente le pregunta al servidor sobre la image...

13  Servidor de socket TCP  ( Tcp socket server ) 
Solo he estado codificando C # unas semanas y estaba esperando una pequeña crítica constructiva de un servidor de socket en el que he estado trabajando en: ...

7  Servidor de autenticación TCP y cliente  ( Tcp authentication server and client ) 
Esta es la primera vez que trato con C #, ya que estoy acostumbrado a los sockets de Java, así que quiero su revisión completa y cualquier cosa que crea que p...

2  Aplicación Simple TCP Client Server con Side Side Side  ( Simple tcp client server application with receive side only ) 
Escribí la aplicación Simple TCP Client Server, me preguntaba, ¿podría revisar mi código? Estaría agradecido por cualquier sugerencia y consejos sobre la lógi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos