Удаленное клиент-серверное приложение не может принимать входящие сообщения

В моем классе .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-адрес второй стороны (стороны, с которой вы общаетесь), а затем предоставляются два текстовых поля — одно для отображения разговора (многострочное), а другое — для приема сообщений. Этот код может отправить сообщение на сервер. Но тем не менее, он не может принимать входящие сообщения от других сторон.


person Smiley    schedule 24.07.2010    source источник


Ответы (2)


Код сервера

Создайте новый канал для прослушивания связи через порт 8085.

TcpChannel channel = new TcpChannel(8085);

Зарегистрируйтесь в службах удаленного канала.

ChannelServices.RegisterChannel(channel);

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

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

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

Консоль.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.

person jgauffin    schedule 24.07.2010
comment
Спасибо за это, сэр. Еще одна вещь, не могли бы вы взглянуть на мое редактирование выше? Я разместил там копию моего текущего кода. Я просто хочу знать, с чего начать. Поскольку мы просто ссылаемся на библиотеку классов RemoteObject из внешнего проекта. Я понятия не имею, как Hello World! печатается, когда я даже не вижу ничего, что вызывает метод PrintMessage() или даже Console.WriteLine("Hello World!") на стороне сервера. Большое спасибо. - person Smiley; 24.07.2010

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

Клиент:

  1. Создайте форму.
  2. Добавить кнопку
  3. В обработчике события Click кнопки вызовите код «CLIENT», который вы включили в свое сообщение.

Сервер:

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

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

person 3Dave    schedule 24.07.2010