2015-05-16 2 views
0

Я разрабатываю клиент-серверное приложение, где клиент находится на Android и сервер на C#. Прежде чем использовать C# для сервера, я использовал autoIT, и он отлично работал в стороне от того факта, что мне приходилось отправлять сообщения из 9 символов, иначе они получат странные символы.Сервер некорректно читает сообщение

Теперь в C# у меня такая же проблема. Я попытался удалить все пробелы, но он всегда оставляет что-то в начале сообщения.

Одиночные сообщения слова как:

"SendClose" 

сервер читает, как

"  SendClose" or " SendClose" if i remove the white spaces 

Примечания ведущего белого пространства. Это интересно, потому что, когда я проверяю длину строки, она говорит, что это всего лишь 11 символов, поэтому я не знаю, что происходит; возможно 2 вкладки?

Вот мой C# код:

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

public class TcpListenerSample { 
    static void Main(string[] args) { 
    try { 
     // set the TcpListener on port 13000 
     int port = 80; 
     IPAddress localAddr = IPAddress.Parse("192.168.1.68"); 
     TcpListener server = new TcpListener(localAddr, port); 

     // Start listening for client requests 
     server.Start(); 


     // Buffer for reading data 
     byte[] bytes = new byte[1024]; 
     string data; 

     //Enter the listening loop 
     while (true) { 
     Console.Write("Waiting for a connection... "); 

     // Perform a blocking call to accept requests. 
     // You could also user server.AcceptSocket() here. 
     TcpClient client = server.AcceptTcpClient(); 
     Console.WriteLine("Connected!"); 

     // Get a stream object for reading and writing 
     NetworkStream stream = client.GetStream(); 

     int i; 

     // Loop to receive all the data sent by the client. 
     i = stream.Read(bytes, 0, bytes.Length); 

     while (i != 0) { 
      // Translate data bytes to a ASCII string. 
      data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
      Console.WriteLine(String.Format("Received: {0}", data)); 

      // Process the data sent by the client. 
      data = data.ToUpper(); 

      byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); 

      // Send back a response. 
      stream.Write(msg, 0, msg.Length); 
      Console.WriteLine(String.Format("Sent: {0}", data)); 

      i = stream.Read(bytes, 0, bytes.Length); 

     } 

     // Shutdown and end connection 
     client.Close(); 
     } 
    } 
    catch (SocketException e) { 
     Console.WriteLine("SocketException: {0}", e); 
    } 


    Console.WriteLine("Hit enter to continue..."); 
    Console.Read(); 
    } 

} 
+0

ли breakpointed вы и отлажена, чтобы гарантировать, что 'msg' значение нужного размера? Вы должны использовать контрольные точки для проверки своих объектов. –

+0

Что значит подходящий размер? –

+0

Хорошо, что 'msg' становится 11 байтами? Убедитесь, что он имеет буквальное ASCII-представление 'SendClose' в первую очередь. –

ответ

-1
 data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
     Console.WriteLine(StripExtended(data));   



     static string StripExtended(string arg) 
     { 
      StringBuilder buffer = new StringBuilder(arg.Length); //Max length 
      foreach(char ch in arg) 
      { 
       UInt16 num = Convert.ToUInt16(ch);//In .NET, chars are UTF-16 
       //The basic characters have the same code points as ASCII, and the extended characters are bigger 
       if((num >= 32u) && (num <= 126u)) buffer.Append(ch); 
      } 
      return buffer.ToString(); 
     } 
    } 
} 
+0

Источник: http://rosettacode.org/wiki/Strip_control_codes_and_extended_characters_from_a_string#C.23 –

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