为什么我收不到聊天服务器的消息?

问题描述 投票:0回答:1

为什么我收不到服务器聊天消息?

我在 Visual Studio C# 中使用 Mono for Android 开发了客户端聊天。 我想从服务器聊天接收消息。它们已发送,但客户端聊天可能会收到它们,但我无法在 Text1.Text 中显示它们

接收消息的聊天客户端源码:

  //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();
    }


   
}

}

c# android .net mono xamarin.android
1个回答
2
投票

您似乎正在尝试从非 UI 线程更新文本(如果您跟踪调用堆栈,您会发现该方法是从您生成的专用线程触发的):

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

而是使用

RunOnUiThread()
安排文本更改在 UI 线程上运行:

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

此外,您应该摆脱一路上捕获的空异常 - 这很可能掩盖了问题。

还要始终检查目录中是否有异常,它们通常是一个很好的指示器。

© www.soinside.com 2019 - 2024. All rights reserved.