Приложение удаленного клиента-сервера не может принимать входящие сообщения - PullRequest
1 голос
/ 24 июля 2010

В моем классе .Net мы создаем простое приложение для чата.Наш профессор дал нам следующий пример кода:

СЕРВЕР:

TcpChannel channel = new TcpChannel(8085);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "myobject", WellKnownObjectMode.Singleton);
Console.ReadLine();

КЛИЕНТ:

TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel);
RemoteObject remoteObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "tcp://localhost:8085/myobject");
remoteObject.PrintMessage("Hello world!");
Console.ReadLine();

УДАЛЕННЫЙ ОБЪЕКТ:

[Serializable]
public class RemoteObject : MarshalByRefObject
{
   public void PrintMessage()
   {
      Console.Write("Hello World!");
      Console.ReadLine();
   }
}

С этим кодом он в основном печатает сообщение «Hello World» на экране консоли сервера при каждом запуске клиента.Однако мы не понимаем, как это работает, поскольку он не полностью объяснил, что делает каждая строка.Мы знаем только о каналах.Суть в том, что с помощью этих кодов мы должны создать Windows-форму чата.Нам удалось заставить это приложение отправить сообщение, предоставленное пользователем, но мы не можем понять, как мы можем сделать это в форме Windows, так как мы не понимаем код, с которого нужно начинать.

Если кто-то можетпомогите нам с некоторыми указателями и рекомендациями о том, как мы можем сделать это в форме Windows, пожалуйста, сообщите нам об этом.Любой вклад приветствуется.

Если это поможет каким-либо образом, приведенный ниже код настолько далеко, насколько мы могли бы пойти на данный момент:

public partial class Form1 : Form
{
    RemoteObject ro;

    public Form1()
    {
        InitializeComponent();

        TcpChannel serverChannel = new TcpChannel(8085);
        ChannelServices.RegisterChannel(serverChannel, true);
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "myobject", WellKnownObjectMode.Singleton);
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        try
        {
            ro = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "tcp://" + txtIpAddress.Text + ":8085/myobject");

            ro.PrintMessage(txtMessage.Text);
            txtChatArea.AppendText(System.Environment.MachineName + ": " + txtMessage.Text + "\n");
            txtMessage.Clear();
        }
        catch (SystemException error)
        {
            MessageBox.Show("Error 101: " + error.Message, "Connection Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

Код выше в основном запрашивает IPАдрес второй стороны (стороны, с которой вы общаетесь), а затем предоставлены два текстовых поля - одно для отображения разговора (многоканальный), а другой для принятия сообщений.Этот код может отправить сообщение на сервер.Но, тем не менее, он не может принимать входящие сообщения от других сторон.

Ответы [ 2 ]

1 голос
/ 24 июля 2010

Код сервера

Создание нового канала, прослушивающего соединение на порту 8085

TcpChannel channel = new TcpChannel(8085);

Регистрация с услугами удаленного канала.

ChannelServices.RegisterChannel(channel);

Скажите удаленно, что мы используем службу типа RemoteObject, и ее следует создать один раз.

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "myobject", WellKnownObjectMode.Singleton);

Readline просто используется для ожидания ввода (перед выходом из консольного приложения).

Console.ReadLine ();

Код клиента

То же, что на стороне сервера

TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel);

Создание прокси-сервера удаленного взаимодействия, который связываетсяс сервером на локальном хосте через порт 8085 и используется RemoteObject

RemoteObject remoteObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "tcp://localhost:8085/myobject");

Отправить сообщение на сервер

remoteObject.PrintMessage("Hello world!");

Заключительные слова

Вы можете добавитьбольше методов для класса RemoteObject для создания полноценного приложения чата.

Также читайте о удаленных обратных вызовах .Ваш профессор немного устарел.Удаленное взаимодействие было заменено WCF на Microsoft.

0 голосов
/ 24 июля 2010

Я не собираюсь делать за вас домашнюю работу, написав код, но это может привести вас в правильном направлении:

Клиент:

  1. Создать форму.
  2. Добавить кнопку
  3. В обработчике события Click кнопки назовите свой код "КЛИЕНТ", который вы указали в своем сообщении.

Сервер:

Вместо вызова Console.WriteLine (), который действительно полезен только в консольных приложениях, вам нужно будет либо показать диалоговое окно, когда серверу нужно отобразить сообщение, либо добавить текст в TextBox, ListView или другой элемент управления.

Есть много разных способов сделать это, и правильный в этом сценарии действительно зависит от предпочтений вашего профессора. Я бы зашел к нему в офис и узнал бы больше информации. (Кстати, большинству профессоров это нравится, когда вы делаете это. Они могут не дать вам ответ, который вы хотели бы, но это не помешает узнать их лучше.)

...