C# для профессионалов. Том II
Шрифт:
}
Другим вспомогательным методом является
GetRandomQuoteOfTheDay
. Этот метод возвращает случайную цитату из цитат StringCollection quotes
: protected string GetRandomQuoteOfTheDay {
int index = random.Next(0, quotes.Count); return quotes[index];
}
В методе
Start
весь файл, содержащий цитаты, в StringCollection quotes
считывается с помощью вспомогательной функции ReadQuotes
. После этого запускается новый
Listener
. Мы используем поток выполнения, так как метод Start
не может блокироваться и ждать клиента, он должен сразу же вернуть управление вызывающей стороне (SCM). SCM предположит, что запуск отказал, если метод не вернет своевременно управление вызывающей стороне. public void Start {
ReadQuotes;
listenerThread = new Thread(new ThreadStart(this.Listener));
listenerThread.Start;
}
Функция потока выполнения
Listener
создает экземпляр TCPListener
. В методе AcceptSocket
ожидается соединение клиента. Как только клиент соединяется, AcceptSocket
возвращает управление с сокетом, связанным с клиентом. Метод GetRandomQuoteOfTheDay
вызывается для отправки возвращаемой случайной цитаты клиенту с помощью socket.Send
: protected void Listener {
listener = new TcpListener(port);
listener.Start;
while (true); {
Socket socket = listener.AcceptSocket;
if (socket == null) {
return;
}
string message = GetRandomQuoteOfTheDay;
UnicodeEncoding encoder = new UnicodeEncoding;
byte [] buffer = encoder.GetBytes(message);
socket.Send(buffer, buffer.Length, 0);
socket.Close;
}
}
Помимо
Start
существуют другие методы для управления службой: Stop
, Suspend
и Resume
: public void Stop {
listener.Stop;
}
public void Suspend {
listenerThread.Suspend;
}
public void Resume {
listenerThread.Resume;
}
Методом, который будет открыто доступным, является
RefreshQuotes
. Если содержащий цитаты файл изменяется, то запускается повторное чтение данного файла с помощью этого метода: public void RefreshQuotes {
ReadQuotes;
}
}
}
Прежде чем разрабатывать службу для нашего сервера, полезно будет создать тестовую программу, которая имеет экземпляр
QuoteServer
Start
. Таким образом можно протестировать функциональность без необходимости обрабатывать специфические для службы вопросы. Можно сконцентрироваться на создании требуемой функциональности. Этот тестовый сервер должен запускаться вручную и код легко просматривается с помощью отладчика. Тестовая программа является консольным приложением C#. Мы ссылаемся на сборку класса
QuoteServer
. Содержащий цитаты класс копируется в каталог с:\wrox
(или нужно изменить аргумент конструктора для определения, куда копируется файл). После вызова конструктора мы обращаемся к методу Start
экземпляра QuoteServer.Start
возвращает управление сразу после создания потока выполнения, поэтому консольное приложение продолжает выполняться до тех пор, пока не будет нажата клавиша Return
: static void Main(string[] args) {
QuoteServer qs = new QuoteServer(@"c:\wrox\quotes.txt", 4567);
qs.Start;
Console.WriteLine("Hit return to exit");
Console.ReadLine;
qs.Stop;
}
Отметим, что
QuoteServer
с помощью этой программы будет выполняться на порте 4567 на localhost
и необходимо использовать эти настройки позже на клиенте. Пример TcpClient
Клиент является простым приложением Windows, где можно вводить имя хоста и номер порта сервера. Это приложение использует класс
TCPClient
для соединения с функционирующим сервером и получения возвращаемого сообщения для вывода его в текстовом поле. Внизу формы выводится статусная строка: В этом коде используются инструкции
using
: using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
Мы также включаем ссылку на файл
QuoteServer.dll
. Оставшаяся часть кода автоматически создается в IDL, поэтому он здесь не будет рассматриваться подробно. Основная функциональность клиента находится в обработчике нажатия кнопки Get Quote: protected void buttonQuote_Click(object sender, System.EventArgs e) {
statusBar.Text = "";
string server = textBoxHostname.Text;
try {
int port = Convert.ToInt32(textBoxPortNumber.Text);
} catch (FormatException ex) {
statusBar.Text = ex.Message; return;
}
TcpClient client = new TcpClient;
try {
Поделиться:
Популярные книги
Убивать чтобы жить 4
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Новик
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Инвестиго, из медика в маги. Том 6. Финал
6. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 11
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Леди Малиновой пустоши
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Аристократ из прошлого тысячелетия
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга IX
9. КО: Страж Кодекса
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Солнечный корт
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Охота на царя
2. Сыщик Его Величества
Детективы:
исторические детективы
8.68
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга V
5. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 8
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Надуй щеки! Том 6
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00