1. Делфи и сокет
Компьютерная сеть состоит из ряда сетевых протоколов связи, основными протоколами которых являются протоколы TCP/ip и UDP на транспортном уровне. TCP ориентирован на установление соединения, и обе взаимодействующие стороны поддерживают путь, как и текущая телефонная линия. Если вы используете telnet для входа в BBS, используется протокол TCP UDP без установления соединения, и взаимодействующие стороны не поддерживают ни одну из них. статус другого. Используется при доступе браузера к Интернету. Протокол HTTP основан на протоколе UDP. Протоколы TCP и UDP очень сложны, особенно протокол TCP. Чтобы обеспечить правильность и эффективность сетевой передачи, необходимо выполнить ряд сложных процессов исправления ошибок и сортировки.
Сокет — это спецификация сокета, основанная на протоколах транспортного уровня (в основном TCP и UDP). Первоначально она была предложена Калифорнийским университетом в Беркли. Она определяет спецификацию для связи между двумя компьютерами (также спецификацию программирования). «канал», то два конца этого «канала» представляют собой две розетки. Сокеты скрывают различия между базовым программным обеспечением связи и конкретными операционными системами, делая возможным обмен данными между любыми двумя компьютерами, на которых установлено программное обеспечение протокола TCP и реализована спецификация сокета.
Спецификация сокетов Windows (сокращенно Winsock) расширяет спецификацию сокетов Беркли. Используя стандартные методы сокетов, вы можете взаимодействовать с сокетами на любой платформе, используя ее расширения, вы можете более эффективно реализовать их на платформах Windows. В Delphi базовый сокет также должен быть сокетом Windows. Socket снижает сложность написания программного обеспечения для связи между компьютерами, но в целом оно все еще довольно сложное (подробно это будет обсуждаться позже); InPRise эффективно инкапсулирует Windows Socket в Delphi, позволяя пользователям легко писать программы сетевого взаимодействия. Ниже мы объясним на примерах, как использовать Socket для написания коммуникационных программ на Delphi.
2. Используйте Delphi для написания программы связи Socket.
Ниже представлена простая программа связи Socket, в которой клиент и сервер представляют собой одну и ту же программу. Когда клиент (сервер) вводит фрагмент текста в memo1 и нажимает Enter, текст может отображаться на сервере (клиенте) в. memo2, верно и обратное. Конкретные шаги заключаются в следующем:
1. Создайте новую форму и назовите ее произвольно. Вы также можете установить ее как ChatForm; поместите MainMenu (в столбец Standard) и создайте пункты меню ListenItem, ConnectItem, Disconnect и Exit; выберите TServerSocket и TClientSocket из столбца Интернет и добавьте их в ChatForm, где имя TClientSocket установлено как ClientSocket, Установите порт на 1025, активный по умолчанию — false; установите имя TServerSocket на ServerSocket, установите порт на 1025, активный по умолчанию — false, а остальные оставьте без изменений, затем добавьте две заметки, одну с именем memo1 и другую; другое Для memo2 цвет memo2 установлен на серый, поскольку он в основном используется для отображения ввода другой стороны. Ниже мы объясним причину при написании кода.
2. Дважды щелкните ListemItem. Напишите следующий код:
процедура TChatForm.ListenItemClick(Отправитель: TObject);
начинать
ListenItem.Checked := не ListenItem.Checked;
если ListenItem.Checked тогда
начинать
ClientSocket.Active := Ложь;
ServerSocket.Active := Истина;
конец
еще
начинать
если ServerSocket.Active, то
ServerSocket.Active := Ложь;
конец;
конец;
Описание этого сегмента программы следующее: Когда пользователь выбирает ListemItem, ListenItem инвертируется. Если он выбран, это означает, что он находится в состоянии Listen. Читателям необходимо понять: Listen — это собственный метод, когда используется Socket. в качестве сервера. Если он находится в режиме прослушивания, то ServerSocket устанавливается в активное состояние, в противном случае прослушивание отменяется и ServerSocket закрывается; Фактически изначально только пользователь выбирает этот пункт меню, что указывает на то, что программа выступает в роли сервера. Напротив, если пользователь выбирает ConnectItem, его необходимо использовать в качестве клиента.
3. Дважды щелкните ConnectItem и введите следующий код.
процедура TChatForm.ConnectItemClick(Отправитель: TObject);
начинать
если ClientSocket.Active, то ClientSocket.Active := False;
if InputQuery('Компьютер для подключения', 'Имя адреса:', Сервер) then
если Длина (Сервер) > 0, то
с ClientSocket сделать
начинать
Хост:= Сервер;
Активно := Истина;
ListenItem.Checked := Ложь;
конец;
конец;
Основная функция этой программы — настроить приложение в качестве клиента, когда пользователь выбирает пункт меню ConnectItem, и появляется всплывающее поле ввода, позволяющее пользователю ввести адрес сервера. Вот почему мы не исправляем хост ClientSocket вначале, чтобы пользователи могли динамически подключаться к разным серверам. Читателям необходимо понять, что адрес хоста — это всего лишь атрибут, который имеет Socket, когда он является клиентом. Когда Socket является сервером, он «обычно» не использует адрес, поскольку он привязан к локальному компьютеру.
4. Напишите следующий код в методе keydown memo1:
процедура TChatForm.Memo1KeyDown (Отправитель: TObject; var Key: Word;
Сдвиг: TShiftState);
начинать
если Ключ = VK_Return, то
если IsServer, то
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
еще
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
конец;
Функция этого кода очевидна, то есть он начинает отправлять сообщения. Если это сервер, он отправляет сообщение только первому клиенту. Поскольку сервер может подключаться к нескольким клиентам, и каждое соединение с клиентом поддерживается сокетом, в массиве ServerSocket.Socket.Connections хранится сокет. который поддерживает связь с Клиентом. В стандартном Socket серверный Socket получает Socket, который поддерживает соединение с клиентом через возвращаемое значение метода Accept(), а методы отправки и получения сообщений — send(sendto) и Recv(recvfrom) соответственно. Delphi выполнила эту инкапсуляцию.
5. Краткое введение в остальные коды.
процедура TChatForm.ServerSocketAccept(Отправитель: TObject;
Сокет: TCustomWinSocket);
начинать
IsServer := Истина;
конец;
Метод Accept для ServerSocket завершается при первом подключении клиента. Судя по его параметрам, можно считать, что он выполняется после стандартного метода принятия. Поскольку существует тип параметра TCustomWinSocket, он должен быть возвращаемым значением. стандартный серверный сокет.
процедура TChatForm.ClientSocketRead(Отправитель: TObject;
Сокет: TCustomWinSocket);
начинать
Memo2.Lines.Add(Socket.ReceiveText);
конец;
процедура TChatForm.ServerSocketClientRead(Отправитель: TObject;
Сокет: TCustomWinSocket);
начинать
Memo2.Lines.Add(Socket.ReceiveText);
конец;
Эти два фрагмента кода запускаются Delphi, когда серверная и клиентская стороны получают сообщения друг друга, и их функция — отображать полученные сообщения в memo2. Среди них сокет в ClientSocketRead на самом деле является самим сокетом, а сокет в ServerSocketClientRead на самом деле является сокетом в ServerSocket.Socket.Connection[]. Однако в Delphi сокет на стороне сервера эффективно инкапсулирован.
процедура TChatForm.ServerSocketClientConnect(Отправитель: TObject;
Сокет: TCustomWinSocket);
начинать
Memo2.Lines.Очистить;
конец;
процедура TChatForm.ClientSocketDisconnect(Отправитель: TObject;
Сокет: TCustomWinSocket);
начинать
ListenItemClick (ноль);
конец;
Эти два абзаца относительно просты. Среди них ServerSocketClientConnect запускается, когда ServerSocket получает новое соединение. ClientSocketDisconnect срабатывает, когда ClientSocket выдает Disconncet.
процедура TChatForm.Exit1Click(Отправитель: TObject);
начинать
Серверсокет.Закрыть;
ClientSocket.Close;
Закрывать;
конец;
процедура TChatForm.Disconnect1Click(Отправитель: TObject);
начинать
ClientSocket.Active := Ложь;
ServerSocket.Active := Истина;
конец;
Первый пункт — закрыть приложение. В стандартном Socket при закрытии каждого Socket необходимо вызвать метод closesocket(), иначе система не освободит ресурсы. В ServerSockt.Close и ClientSocket.Close метод closesocket() должен вызываться внутри системы.
3. Стандартный сокет и сокет в Delphi.
Стандартная структура приложения Socket выглядит следующим образом:
На стороне сервера: Socket()[Создать новый сокет]--Bind()[Привязать с адресом сервера]--Listen()--Accept()--block wait--read()[Принимать сообщения в окнах платформа, метод — send(TCP) или sendto(UDP)] — обработать запрос службы — Write()[отправить сообщение, на платформе Windows метод — send(TCP), Или отправить(UDP).
Клиентская часть относительно проста: Socket()--Connect() [Подключиться к конкретному серверу через определенный порт, который должен установить соединение с сервером]--Write()--Read().
Socket может быть основан на TCP или UDP, а Socket даже построен на других протоколах, таких как IPX/SPX, DECNet и т. д. При создании нового сокета вы можете указать, какой тип сокета создавать. Bind() используется для привязки к адресу сервера. Если хост имеет только один IP-адрес, роль привязки на самом деле относительно избыточна. Listen() начинает мониторинг сети, Accept() используется для принятия соединения, а его возвращаемым значением является сокет, который поддерживает связь с клиентом.
В Delphi Socket в Windows эффективно инкапсулирован. В Delphi в соответствии с отношениями наследования их можно разделить на две категории:
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. Наследовать непосредственно от TObject:
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
Видно, что первый тип основан на TCustomSocket, а второй тип — на TCustomWinSocket. Первый тип построен на TComponet, а второй тип построен непосредственно на TObject. Поэтому, если пользователь хорошо знаком с Socket и хочет написать консольную программу, он может использовать класс TCustomWinScoket.
Как видно из тех же вариантов использования, все они реализованы в ScktComp.pas, а schtComp.pas содержит файл winsock.pas. Если вы продолжите копаться в файле winsock, то сможете найти все основные методы Windows Socket.
Фактически, если вы понимаете структуру стандартных приложений Socket, вам будет удобно использовать Delphi для написания приложений Socket. Это не означает, что вы должны понимать стандартные функции в сложных Socket, и это не обязательно, поскольку Delphi уже сделал это; для вас Он хорошо инкапсулирован, и в этом сила Delphi. Вам нужно лишь немного понять базовую структуру.
Таково мое понимание приложений Socket в Delphi. Надеюсь, вы поправите меня, если у меня возникнут какие-либо недостатки. В то же время я также рад ответить на вопросы о Socket в Delphi.