public interface IAMRemoting
{
event ArticleChanged OnArticleChanged;
event CategoryChanged OnCategoryChanged;
bool GetImage(Image image);
int SetImage(Image image);
void DeleteImage(Image image);
}
Cетевое программирование на C#.
Появилась проблема:
Есть сервер - многопоточный, обрабатывает кучу клиентов, все работает корректно. Каждый новый клиент - отдельный поток. все обрабатывается, клиентам ответы посылаются.
А вот с клиентов вознилка проблема.
1) Как правильно реализовать прием пакета, при условии, прием пакета, может происходит без предварительного запроса? Т.е., например, один из клиентов что-то изменил, отправил это изменение на сервер, а сервер в свою очередь рассылает всем клиентам это изменение.
2) Так же, возможно ситуация, когда клиент отпраляет запрос и ожидает ответа от сервера
Я думал, что прием сообщений надо сделать в отдельном потоке...но, тогда, каким образом ответ от сервера, во 2м случае.
Так же, возникает проблема, как отслеживать, например, загрузку информации, когда приходит от сервера 600-800 ответов на один запрос...
Подскажите, как это все реализовать или где можно почитать про реализацию такого плана приложений. Спасибо.
По сабджу:
1. Как у вас реализована работа с сетью на сервере?
2. Как реализована работа с сетью на клиенте?
3. Непонятно, что имелось в виду под "как отслеживать, например, загрузку информации, когда приходит от сервера 600-800 ответов на один запрос." Нагрузка в запросах в секунду или в сутки?:)
Короче, опишите подробнее, как у вас что сделано и тогда проблема станет яснее.
Теперь возникла другая проблема:
Есть интерфейс:
Код:
Есть серверная реализация этого интерфейса:
Код:
public event ArticleChanged OnArticleChanged
public bool GetImage(Image image)
{
return true;
}
public int SetImage(Image image)
{
if(OnArticleChanged != null)
OnArticleChanged(article, Operation.Add);
}
public void DeleteImage(Image image)
{
if(OnArticleChanged != null)
OnArticleChanged(article, Operation.Delete);
}
public bool GetImage(Image image)
{
return true;
}
public int SetImage(Image image)
{
if(OnArticleChanged != null)
OnArticleChanged(article, Operation.Add);
}
public void DeleteImage(Image image)
{
if(OnArticleChanged != null)
OnArticleChanged(article, Operation.Delete);
}
На клиенте получаю этот класс, через (IAMRemoting)Activator.GetObject(typeof(IAMRemoting), String.Format("{0}/{1}",uri,"AMRemoteFunctions"));
Все работает отлично. Пока я не пытаюсь присвоить евенту какое-то событие.
Как только я присваиваю евенту событие, вылетает ошибка:
Exception has been thrown by the target of an invocation.
Event сам по себе является Сериализуемым.
И класс, в котором хранятся клиентские евенты, тоже сериализуем и MarshalByRefObject.
Вроде должно работать, а нет:-(
В чем может быть проблема?