2015-01-30 3 views
0

Я создаю простое приложение в программировании сокетов. Я думаю, что это простой способ добиться этого. поэтому я разделяю это. В этой программе вы можете создать серверную программу и клиентскую программу. И вы также можете отправлять и получать сообщения от клиента и сервера. вот мой код программы сервераПростой пример программирования сокета в c sharp

: -

class Program 
    { 
     private const int port = 4532; 
     static void Main(string[] args) 
     {      

      IPEndPoint ip = new IPEndPoint(IPAddress.Any, 4532); 
      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      socket.Bind(ip); 
      socket.Listen(10); 
      Console.WriteLine("Waiting for client"); 
      Socket client = socket.Accept(); 
      IPEndPoint clientIP = (IPEndPoint)client.RemoteEndPoint; 
      Console.WriteLine(" >> Connected with" + clientIP.Address + "at port" + clientIP.Port); 
      Console.WriteLine(" >> Accept connection from client"); 

      string welcome = "Welcome"; 
      byte[] data = new byte[1024]; 
      data = Encoding.ASCII.GetBytes(welcome); 
      client.Send(data, data.Length, SocketFlags.None); 
      Console.WriteLine("......"); 
      Console.Read(); 

     } 

    } 

Программа Клиент: -

class Program 
    { 
     static void Main(string[] args) 
     { 

      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4532); 
      Console.WriteLine("Client Started"); 
      try 
      { 
       socket.Connect(ip); 
      } 
      catch(SocketException e) 
      { 
       Console.WriteLine("Enable to connect"); 
      } 
      Console.WriteLine("Conneted to server"); 

      byte[] data = new byte[1024]; 
      int receivedata = socket.Receive(data); 
      string stringdata = Encoding.ASCII.GetString(data, 0, receivedata); 
      Console.WriteLine(stringdata); 
      Console.Read(); 
     } 
    } 

ответ

1

Ну, это не совсем верно.

Обратите внимание, что Encoding.ASCII.GetBytes даст вам новый массив каждый раз, так что инициализация new byte[1024] бесполезна, массив может быть больше, если строка больше.

Что произойдет, если сервер отправит полезную нагрузку более 1024? Клиент будет обрезать сообщение, что приведет к ошибкам сериализации, если вы используете структурированный формат данных, такой как XML или JSON. В сообщениях TCP вам необходимо определить протокол для данных кадра, чтобы ваш код мог определить, когда сообщение было запущено или закончилось, например сообщение в строке или что-то более сложное, например, кадрирование WebSocket.

Обратите внимание, что сервер будет принимать только одного клиента, отправить приветствие и застрять в Console.Read. Он должен слушать больше клиентов в цикле и запускать новый поток для каждого подключенного клиента или использовать асинхронные операции. То же самое для клиента, он должен прослушивать сообщения в цикле.

Рассмотрите возможность асинхронизации/ожидание дальнейшего расширения вашего примера. Готовый к производству сервер TCP должен быть многопоточным для масштабирования соответствующим образом.

Взгляните на этот пример asynchronous TCP server and client, а не на готовность к производству, но достаточно для доказательства концепции с чтением буфера и асинхронными операциями.

Смежные вопросы