Структура приёма сообщений
Прикладная программа, используя интерфейс WinAPI и встроенные функции Windows, постоянно опрашивает почтовый слот на наличие приходящего сообщения. В отличие от DOS, например, в котором данная реализация представляла бы бесконечный цикл и все ресурсы компьютера уходили бы на ожидание сообщения, операционная среда Windows позволяет создавать такие циклы без практической потери ресурсов, разделяя части программы на потоки (threads). При наличии сообщения в почтовом слоте оно передаётся в программу средствами NetBIOS. Почтовый слот может содержать в себе любое количество сообщений, независимо от того, когда они все будут востребованы данной программой.
Прием сообщений можно реализовать следующим образом:
import java.awt.event.KeyEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
// Using Threads ..
public class SecondClient extends javax.swing.JFrame {
static Socket SendSocket = null;
//************************************************************************//
public SecondClient() {
initComponents();
SendArea.requestFocusInWindow();
setLocation(getWidth(), 0);
}
@SuppressWarnings("unchecked")
//
private void initComponents() {
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
RecievedArea = new javax.swing.JTextArea();
jScrollPane2 = new javax.swing.JScrollPane();
SendArea = new javax.swing.JTextArea();
SendButton = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Second Client");
jSplitPane1.setDividerLocation(240);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
RecievedArea.setColumns(20);
RecievedArea.setRows(5);
jScrollPane1.setViewportView(RecievedArea);
jSplitPane1.setTopComponent(jScrollPane1);
SendArea.setColumns(20);
SendArea.setRows(1);
SendArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
SendAreaKeyPressed(evt);
}
});
jScrollPane2.setViewportView(SendArea);
jSplitPane1.setRightComponent(jScrollPane2);
SendButton.setText("Отправить");
SendButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
SendButtonActionPerformed(evt);
}
});
jLabel1.setForeground(new java.awt.Color(204, 0, 0));
jLabel1.setText(" ");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(163, 163, 163)
.addComponent(SendButton))
.addComponent(jLabel1))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jSplitPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 309, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(SendButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
.addComponent(jLabel1)
.addContainerGap())
);
pack();
}//
//************************************************************************//
private void SendButtonActionPerformed(java.awt.event.ActionEvent evt) {
SendMessage(SendArea.getText());
SendArea.setText("");
}
//************************************************************************//
//Click event, when the user press enter send the message the second client
private void SendAreaKeyPressed(java.awt.event.KeyEvent evt) {
if (KeyEvent.getKeyText(evt.getKeyChar()).equals("Enter")) {
SendButtonActionPerformed(null);
SendArea.setCaretPosition(0);
}
}
//************************************************************************//
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SecondClient().setVisible(true);
}
});
OpenSocketAndRecieve();
}
//************************************************************************//
public static void OpenSocketAndRecieve() {
new Thread() {
@Override
public void run() {
try {
ServerSocket server = new ServerSocket(12346);
while (true) {
Socket socket = server.accept();
DataInputStream input = new DataInputStream(socket.getInputStream());
RecievedArea.append("\n" + input.readUTF());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}//end method
//************************************************************************//
public static void SendMessage(String text) {
try {
SendSocket = new Socket("127.0.0.1", 12345);
DataOutputStream out = new DataOutputStream(SendSocket.getOutputStream());
out.writeUTF("The Server Said : " + text);
RecievedArea.append("\n I said : " + text);
} catch (Exception e) {
System.out.println(e);
}
}//end method
// Variables declaration - do not modify
private static javax.swing.JTextArea RecievedArea;
private javax.swing.JTextArea SendArea;
private javax.swing.JButton SendButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
// End of variables declaration
}
Процедура Timer1Timer является ядром получения сообщений, в то время как ShowMess – реализацией выдачи сообщения на экран в виде, понятном пользователю.
Строки
StatusBar1. Panels[0].Text:='Current message: '+IntToStr (current+1);
StatusBar1. Panels[1].Text:='Total number of messages: '+IntToStr (L. Count), входящие в состав данной процедуры, характеризуют номер сообщения по счёту всего количества сообщений и количество всех сообщений.
С учетом вышеописанного, пришедшее сообщение выглядит таким образом:
Рис. 1.12. Пример полученного сообщения
Используя кнопки навигации, можно легко просматривать все пришедшие сообщения, одновременно использую другие функции Messenger’a.
Рис. 1.13. Обзор пришедших сообщений
В данном разделе в части литературного обзора были рассмотрены общие положения, применяемые разработчиками программного обеспечения средств передачи информации в сетях Microsoft, даны основные подходы создания программ отправки и принятия сообщений; показан пример разработки данного программного обеспечения.
В разделе «Постановка задачи» были рассмотрены требования к системе.
Технический проект содержит общую структуру системы, структуру данных, связи между объектами, алгоритмические связи, простота использования подобных программ для пользователей, кратко описаны основные типы компонент и классов, используемые для написания программ отправки сообщений.
В рабочем проекте дана конфигурация технических средств, алгоритмы работы программы, структурная схема работы программы, показана иерархия форм, включая примеры диалога с пользователем и участки программного кода, описывающие важные процедуры системы отправки и принятия сообщений.
В целом представлена полная и объективная картина, отражающая содержание выполненных работ по проектированию программ работы с сетевыми протоколами операционных систем семейства Windows, созданию алгоритмов реализации аналогичного программного обеспечения и их программной реализации.
Разработка программ в среде Borland Delphi 5 относится к технологии RAD (Rapid Application Development) – быстрое создание приложений. До появления RAD‑средств делались попытки облегчить труд программиста, сделать этот труд более продуктивным, повысив этим быстродействие и удобство создания приложений. Первоначально появились интегрированные среды разработки – IDE (Integrated Development Environment), объединяющие компилятор, специальный текстовый редактор, ориентированный на работы с текстами на целевом языке программирования и средства отладки – трассировщик, дебаггер и другие. По сравнению с предыдущими средствами программирования это был большой шаг вперед, но затем появились CASE‑средства, которые позволяли максимально визуализировать процесс создания программы, но пользоваться ими было чересчур неудобно из-за их негибкости. В большинстве случаев написать достаточно сложную программу было очень трудно. Средства RAD, взяв все лучшее из интегрированных сред разработки и CASE систем, объединили гибкость работы с исходными текстами с удобством создания графического интерфейса пользователя – GUI (Graphic User Interface). К сожалению, большинство RAD‑средств не позволяют визуализировать логику самой программы, но и те методы, которые заложены в Delphi 5, позволяют поднять производительность разработки программ в 2–3 раза.
Достарыңызбен бөлісу: |