Модели сетевых приложений в основном включают в себя:
www (World Wide Web) — это система просмотра информации, основанная на модели клиент/сервер, основанная на языке HTML и протоколе HTTP и способная предоставлять различные интернет-услуги. Сетевая информация размещается в разных местах хоста, а www-сервер использует гипертекстовые ссылки для связи различной информации. Клиент www (браузер) отвечает за установление контакта с сервером, отправку запросов на сервер, обработку HTML-гипермедиа, предоставление графического пользовательского интерфейса (GUI), отображение информации и т. д.
В режиме работы клиент/сервер на стороне сервера будьте готовы принимать сообщения от нескольких клиентских компьютеров. С этой целью, помимо использования IP-адресов для идентификации компьютеров в Интернете, также вводятся номера портов для идентификации потоков, обслуживающих фоновые службы на стороне сервера. Комбинация номера порта и IP-адреса называется сетевым сокетом.
В реализации режима C/S в языке Java сокеты делятся на две категории:
Серверная машина предоставляет услуги клиентской машине через порты (адреса ввода-вывода шины); Серверная машина предоставляет несколько различных услуг одновременно на нескольких своих портах. Клиент обращается к определенному порту Сервера и запрашивает Сервер обслужить его через этот порт. Правила: Номера портов 0–1023 предназначены для исключительного использования системой. Например, протокол HTTP находится на порту 80, а протокол telnet — на порту 23. Порты 1024~65535 используются приложениями.
Когда программе-клиенту и программе-серверу необходимо взаимодействовать, класс Socket можно использовать для установления соединения через сокет. Думайте о сокетном соединении как о телефонном звонке: первоначально клиентская программа устанавливает вызов, а серверная программа прослушивает его, после завершения вызова любая сторона может говорить в любое время;
Существует два дополнительных способа установления связи между двумя сторонами: потоковый сокет и сокет дейтаграммы:
Потоковый сокет устанавливает канал связи между программой-клиентом и программой-сервером. Каждый сокет может выполнять операции чтения и записи. Для любой стороны процесс сеанса связи с другой стороной:
Установите соединение сокета, получите потоки ввода/вывода, прочитайте/запишите данные и закройте сокет (разорвите соединение) после завершения связи.
Используя конструктор сокета, объект сокета может быть установлен на стороне клиента на сервере:
Сокет (String host, int port): хост — это IP-адрес сервера, порт — номер порта, они согласовываются заранее.
Например, код:
попробуйте {Socket mySocket = new Socket("http://www.weixueyuan.net", 1860 }catch(IOException e){});
Затем используйте метод getInputStream() для получения входного потока, используйте этот входной поток для чтения информации, помещенной сервером в «строку», используйте метод getOutputStream() для получения выходного потока и используйте этот выходной поток для записать информацию в «строку».
Используя конструктор ServerSocket, вы можете создать объект сокета сервера на сервере, который принимает клиентские сокеты:
ServerSocket(int port): укажите номер порта и создайте объект ServerSocket. Номер порта port должен совпадать с номером порта, вызываемого клиентом. Для этого используйте следующую форму кода:
попробуйте {ServerSocket serverSocket = новый ServerSocket (1860) Catch (IOException e) {};
Серверная программа прослушивает указанный порт. При получении запроса на обслуживание от клиентской программы она создает объект сокета для связи с клиентской программой, соответствующей порту. Например, после выполнения приведенного выше кода для создания объекта сокета сервера и установления объекта serverSocket он может использовать метод Accept() для получения объекта Socket и получения информации от клиентской программы из сокета mySocket. Как показано в следующем коде:
try { Socket sc = serverSocket.accept(); //ac — это объект Socket}catch(IOException e){}
Чтобы отозвать услугу, вы можете закрыть объект Socket sc:
sc.закрыть();
[Пример] Клиентское приложение в режиме C/S. Это простой пример потоковой передачи данных по сокетам на стороне клиента. Код показывает, как написать программу на стороне клиента. В примере клиентская программа делает запрос на порт 4441 хоста сервера. После установления соединения она завершает чтение и запись на сервер.
import java.io.*;import java.net.*;public class Client {public static void main(String args[]){String s = null;Socket mySocket; DataInputStream in = null; DataOutputStream out = null try {mySocket; = новый Socket("localhost",4441); in = новый DataInputStream(mySocket.getInputStream()); out = new DataOutputStream(mySocket.getOutputStream()); out.writeUTF("хороший сервер!"); while(true){ s = in.readUTF(); if(s==null) else System.out.println(s) ); } mySocket.close(); }catch(IOException e){ System.out.println("невозможно подключиться");
[Пример] Серверное приложение, соответствующее клиентскому приложению. Программа прослушивает порт 4441. При обнаружении клиентского запроса генерируется и выводится клиенту строка, содержащая «Клиент, привет, я сервер».
import java.io.*;import java.net.*;public class Server {public static void main(String args[]){ServerSocket server = null; Socket you = null; String s = null; DataOutputStream out = null; in = null; try {server = new ServerSocket (4441); } catch (IOException e1) { system.out.println («ОШИБКА:» + e1); } try { you = server.accept(); in = new DataInputStream (you.getInputStream()); out = new DataOutputStream (you. getOutputStream()); while (true) { s = in.readUTF ( ); if(s!=null)break; } out.writeUTF("Привет, клиент, я сервер"); out.close(); e) {System.out.println(“ОШИБКА:”+e);} }}
Чтобы в полной мере реализовать возможности параллельной работы компьютера, работу по подключению сокета можно выполнить в один поток. Когда клиент запрашивает у сервера предоставление услуг или когда сервер получает запрос на обслуживание от клиента, он запускает поток, предназначенный для завершения передачи информации, создает в этом потоке входной и выходной поток и завершает обмен информацией между клиентом и сервером. сервер.
[Пример] Клиентский апплет, который выполняет работу соединения сокета в потоке. Интерфейс имеет кнопку отправки сообщения, текстовое поле и текстовую область. Клиентское приложение сначала устанавливает сокетное соединение с сервером. Используйте поток ввода данных для многократного чтения информации, введенной сервером в строку, и отображения полученной информации в текстовой области. Если полученная информация имеет значение «Конец», соединение сокета закрывается и программа завершается. Пользователь также может ввести информацию в текстовое поле и нажать кнопку «Отправить информацию», а клиентская программа будет использовать поток вывода данных для отправки содержимого текстового поля на сервер.
импортировать java.net.*;импортировать java.io.*;импортировать java.awt.*;импортировать javax.swing.*;импортировать java.awt.event.*;импортировать java.applet.*;публичный класс Aclient расширяет реализации апплета Runnable, ActionListener {кнопка JButton; JTextField textF; сокет сокета DataInputStream; DataOutputStream out; public void init() { setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); Button = new JButton("Отправить информацию"); textF = new JTextField(20); 20,30); setSize(450,350); JPanel p = новый JPanel(); p.add(textF); p.add(button); add(textA,"Center"); add(p,"South"); button.addActionListener(this); новый Socket(this.getCodeBase().getHost(),4441 in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); общественный недействительный запуск () {String s = null; while (true) { try { s = in.readUTF () } Catch (IOException e) {} if(s.equals("End")){ try{socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e) { if (e.getSource() == button) { String s = textF.getText(); if (s! = null) { try {out.writeUTF (s); }catch(IOException e1){} } else{ try{ out.writeUTF("Пожалуйста, говорите" } catch(IOException e1){} } } }}
[Пример] Программа использует терминал 4441 для установления сокетного соединения с клиентом. После того, как сервер получает запрос клиента, он создает поток с клиентским сокетом и запускает его. Если клиентского приложения нет, продолжайте отслеживать клиентские приложения. Поток устанавливает входной поток данных и выходной поток данных в соответствии с сокетом клиента. Поток использует in для чтения информации, которую клиент вводит в строку. Если полученная информация — «Конец», сервер отвечает «Конец», а затем закрывает соединение сокета; в противном случае он отвечает: «Я тот сервер, который вы мне сказали», и информация, полученная сервером.
импортировать java.net.*;импортировать java.io.*;импортировать java.awt.*;импортировать javax.swing.*;импортировать java.awt.event.*;импортировать java.applet.*;публичный класс Aclient расширяет реализации апплета Runnable, ActionListener {кнопка JButton; JTextField textF; сокет сокета DataInputStream; DataOutputStream out; public void init() { setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); Button = new JButton("Отправить информацию"); textF = new JTextField(20); 20,30); setSize(450,350); JPanel p = новый JPanel(); p.add(textF); p.add(button); add(textA,"Center"); add(p,"South"); button.addActionListener(this); новый Socket(this.getCodeBase().getHost(),4441 in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); общественный недействительный запуск () {String s = null; while (true) { try { s = in.readUTF () } catch (IOException e) {} if(s.equals("End")){ try{socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e) { if (e.getSource() == button) { String s = textF.getText(); if (s! = null) { try {out.writeUTF (s); }catch(IOException e1){} } else{ try{ out.writeUTF("Пожалуйста, говорите" }catch(IOException e1){} } } }}