2015-09-21 2 views
2

Моя проблема в том, когда мой клиент отправляет данные, мой сервер делает это только для получения первого отправленного сообщения. Все последующие клиентские сообщения, которые сервер не получает. Если я отлаживаю клиента, он не генерирует никаких исключений, поэтому я думаю, что проблема связана с принятием сервера.C# - Серверный сокет не извлекает данные

Может кто-нибудь сказать, как исправить мой код, который мой клиент может отправить несколько раз на сервер, не создавая новый сокет (на клиенте) для каждого сообщения?

Сервер:

 static Socket connection; 
     static IPEndPoint endpoint; 
     const int BUFFER_SIZE = 1024; 
     static byte[] buffer; 
     static void Main(string[] args) 
     { 
      connection = new Socket(SocketType.Stream, ProtocolType.Tcp); 
      endpoint = new IPEndPoint(IPAddress.Any, 1337); 
      connection.Bind(endpoint); 
      connection.Listen(10); 
      buffer = new byte[BUFFER_SIZE]; 

      connection.BeginAccept(new AsyncCallback(AsyncAccept),null); 
      Console.ReadLine(); 
     } 

     private static void AsyncAccept(IAsyncResult ar) 
     { 
      Socket s = connection.EndAccept(ar); 
      s.BeginReceive(buffer,0,BUFFER_SIZE, SocketFlags.None, new AsyncCallback(AsyncReceive),s); 
      connection.BeginAccept(new AsyncCallback(AsyncAccept), null); 
     } 

     static void AsyncReceive(IAsyncResult ar) 
     { 
      Socket s = (Socket)ar.AsyncState; 
      int received = s.EndReceive(ar); //END 
      byte[] data = new byte[received]; 
      Array.Copy(buffer, data, received); 

      string text = Encoding.Default.GetString(data); 
      Console.WriteLine(text); 

     } 

Клиент:

Socket c; 
    IPEndPoint endpoint; 
    string text; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     c = new Socket(SocketType.Stream, ProtocolType.Tcp); 
     endpoint = new IPEndPoint(IPAddress.Loopback, 1337); 
     c.Connect(endpoint); 
    } 


    private void Send() 
    { 
     byte[] buffer = Encoding.Default.GetBytes(text); 
     c.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendAsync), c); 
    } 

    private void SendAsync(IAsyncResult ar) 
    { 
     Socket s = (Socket)ar.AsyncState; 
     s.EndSend(ar); 
    } 

    private void btnSend_Click(object sender, RoutedEventArgs e) 
    { 
     Thread t = new Thread(Send); 
     text = txtMessage.Text; 
     t.IsBackground = true; 
     t.Start(); 
    } 
+0

Фрагмент (подумайте о пересмотре). – deloreyk

ответ

2

Вы должны начать другой BeginReceive в вашем AsyncReceive обработчика. Исходный асинхронный прием выполнен - ​​вы получите только один ответ, который вы просили.

Кроме того, не думайте о сообщениях при разговоре о TCP - это протокол, основанный на потоках, сообщений нет. Если вы хотите отправлять (и получать) сообщения через TCP, вам необходимо реализовать собственный протокол сообщений поверх TCP.

Я бы предложил немного почитать о том, как работает сеть (и асинхронный ввод-вывод в целом) - так же, как при многопоточности, очень легко получить то, что в основном работает, но невозможно отладить и исправить должным образом. Простейшим примером является то, что вы рассматриваете TCP как протокол на основе сообщений - он будет в основном работать на локальном хосте и в очень ограниченных сетевых условиях, но он небезопасен, и он взорвется вам в лицо.

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