Как сделать функцию C #, чтобы я мог получать сообщения от Server Chat на ПК и Chat Client на устройстве Android? - PullRequest
0 голосов
/ 27 сентября 2011

В моем клиенте чата приложения C # я не знаю, как выполнить функцию для получения сообщений с сервера чата в C # и представления их в клиенте чата TextView

Я программирую в Visual Studio на C #, используя Mono для Android.

Вопрос в том ... Как мне сделать функцию, чтобы я мог получать сообщения с Сервера чата на ПК и Клиента чата на устройстве Android? Когда я использую Chat Client в Windows 7, он работает хорошо, но когда я делаю для устройства Android, я не могу получать сообщения от Server Chat до Chat Client.

Мне кажется, проблема как в общедоступном void RectainedMessage, так и в приватном void UpdateTextbox.

Извините, мой плохой английский. Спасибо за внимание.

Исходный код, клиент чата:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Widget.EditText;
using Android.Widget.Button;
using Android.Widget.TextView;


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;

    string msgrecebida;        

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);


        SetContentView(Resource.Layout.Main);


        Button enviar = FindViewById<Button>(Resource.Id.btenviar);
        Button ligar = FindViewById<Button>(Resource.Id.btligar);
        TextView text1 = FindViewById<TextView>(Resource.Id.text1);
        EditText text2 = FindViewById<EditText>(Resource.Id.text2);

          //Conexão com o servidor 
        ligar.Click += delegate
        {
            Connect();
            ligar.Enabled = false;
            text1.Text = "Connected";
        };



        enviar.Click += delegate
        {

            if (text2.Text != "")
            {
                if (text2.Text.ToLower().StartsWith("/"))
                {
                    text2.Text = "";
                }
                else
                {
                    SendMessage("MSG :" + text2.Text);
                    text2.Text = "";
                }
            }

        };



    }


   private void Invoke(OnRecievedMessage onRecievedMessage, string message)
    {
        throw new NotImplementedException();
    }

    public bool InvokeRequired { get; set; }

    public void RecievedMessage(string message)
    {
        if (InvokeRequired)
        {
            this.Invoke(new OnRecievedMessage(RecievedMessage), message);
        }
        else
        {
            UpdateTextbox(message);
        }
    }
    private void UpdateTextbox(string text)
    {
        msgrecebida += "\r\n";
        msgrecebida += text;

    }


   //Interligações Classes MainChat & Connection
    public void Disconnected(string reason)
    {
        form.Disconnected(reason);
    }





   //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')
        {
            //m_ParentForm.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();
    }

}
}

1 Ответ

2 голосов
/ 28 сентября 2011

Мне кажется, что (одна) проблема в том, что вы пытаетесь получить доступ к text1, как будто это поле или свойство, когда это локальная переменная, объявленная в onCreate.Вам нужно либо подтолкнуть text1 на уровень в области видимости, либо получить новую ссылку на него в RecceiveMessage.В частности, это не проблема с Android, но разница с настройкой кода с Mono для Android.

Как правило, при работе с Winforms в Windows вы будете работать в частичном классе со всеми вашими элементами управления, определенными в файле designer.cs как поля.Но в вашем моно-коде вы вместо этого привязываетесь к TextViews и в OnCreate вместо области видимости.Когда вы копируете / вставляете свой код, вы, вероятно, не учитываете эту разницу.

Кроме того, я очень сомневаюсь, что функция user32.dll, которую вы импортируете, будет полезна для Android.Если только моно не делают что-то волшебное, win32 API не будет доступен на Android.

...