Search code examples
c#android.netmonoxamarin.android

Why I can't recieved messages from chat server?


Why can't I receive messages from the server chat?

I developed the client chat in Visual Studio C# with mono for Android. I want to receive messages from the server chat. They are sent but the client chat may be receiving them and I cannot show them in Text1.Text

The chat client source code for receiving messages:

  //Criado por EcoDuty

  using System;
  using Android.App;
  using Android.Content;
  using Android.Runtime;
  using Android.Views;
  using Android.Widget;
  using Android.OS;

  //
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Text;
 using System.Net;
 using System.Net.Sockets;
 using System.IO;
 using System.Threading;
 using System.Runtime.InteropServices;

 namespace ChatClient_Android
{
[Activity(Label = "ChatClient_Android", MainLauncher = true, Icon = "@drawable/icon")]
public class MainChat : Activity
{
    
    public delegate void OnRecievedMessage(string message);
    
    public MainChat form;
    const int WM_VSCROLL = 0x115;
    const int SB_BOTTOM = 7;
  
    TextView text1;
  
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        Button ligar = FindViewById<Button>(Resource.Id.btligar);
        text1 = FindViewById<TextView>(Resource.Id.text1);
        
      //Conexão com o servidor 
        ligar.Click += delegate
        {
            Connect();
            ligar.Enabled = false;
            
        };

    }

    //Função Actualizar a Caixa de Entrada de Mensagens 
    private void UpdateTextbox(string text)
    {
        text1.Text += "\r\n";
        text1.Text += text;
    }

    //Recieved Mesages
    public void RecievedMessage(string message)
    {
       UpdateTextbox(message);    
    }
  
   //TCP Connection
    public StreamWriter Outgoing;
    private StreamReader Incoming;
    private TcpClient Connection;
    private Thread Messages;
    private IPAddress IP;
    //public string host;
    //public string nick;
    //MainChat m_ParentForm;
    bool isConnected;

    //Função Conectar
    public void Connect()
    {
        try
        {
            IP = IPAddress.Parse("10.0.2.2");
            Connection = new TcpClient();
            Connection.Connect(IP, 1986);
            Outgoing = new StreamWriter(Connection.GetStream());
            Outgoing.WriteLine("EcoDuty");
            Outgoing.Flush();
            //m_ParentForm.Vis(true);
            Messages = new Thread(new ThreadStart(this.Communication));
            Messages.Start();
        }
        catch (Exception e) { Disconnected(e.Message); }
    }
    private void Communication()
    {
        Incoming = new StreamReader(Connection.GetStream());
        string check = Incoming.ReadLine();
        if (check[0] == '1')
        {
            //Vis(true);
            isConnected = true;
        }
        else
        {
            string Reason = "Disconnected: ";
            Reason += check.Substring(2, check.Length - 2);
            Disconnected(Reason);
            return;
        }
        while (isConnected == true)
        {
            try
            {
                ServerMessage(Incoming.ReadLine());
            }
            catch (Exception e)
            {
                if (isConnected == true)
                {
                    Disconnected("Connection to server lost");
                    Console.WriteLine("Connection Lost: " + e.ToString());
                }
                break;
            }
        }
    }
    private void ServerMessage(string message)
    {
        try
        {
            RecievedMessage(message);
        }
        catch { }
    }
    public void CloseConnection()
    {
        isConnected = false;
        Incoming.Close();
        Outgoing.Close();
        Connection.Close();
        Messages.Abort();
    }
    public void SendMessage(string message)
    {
        Outgoing.WriteLine(message);
        Outgoing.Flush();
    }


   
}

}


Solution

  • You seem to be trying to update the text from a non UI thread (if you follow the calls stack you see that the method is triggered from a dedicated thread you spawn):

    private void UpdateTextbox(string text)
    {
        text1.Text += "\r\n";
        text1.Text += text;
    }
    

    Instead use RunOnUiThread() to schedule the text change to run on the UI thread:

    private void UpdateTextbox(string text)
    {
        RunOnUiThread(() =>
        {
          text1.Text += "\r\n";
          text1.Text += text;
        });
    }
    

    Also you should get rid of the empty exception catching you do along the way - this most likely masked the problem.

    Also always check the catlog for exceptions they usually are a good indicator.