Плюсы и минусы Socket
Следующий анализ в основном относится кКомпьютерные сети (Се Сижэнь, 7-е издание)подытожено изСистемный вызов ---> интерфейс прикладного программирования API ---> интерфейс сокетаДля анализа подноготной Socket, разумеется, есть и подробные объяснения Socket в Википедии.
1. Системный вызов
Большинство операционных систем используютсистемный вызовМеханизм передачи управления между приложением и операционной системой. Для программистов системные вызовы очень похожи на вызовы функций в общем программировании.
2. API интерфейса прикладного программирования
Когда процесс приложения инициирует системный вызов, право управления передается от процесса приложения интерфейсу системного вызова, который затем передает право управления операционной системе компьютера. Операционная система перенаправляет этот вызов какой-либо внутренней процедуре и выполняет запрошенную операцию. После выполнения внутреннего процесса право управления возвращается процессу приложения через интерфейс системного вызова.
интерфейс системного вызоваПо сути, это интерфейс для преобразования прав управления процесса приложения и прав управления операционной системы, т. е.API интерфейса прикладного программирования
3. Розетка
Поскольку набор протоколов TCP/IP предназначен для работы в различных средах операционных систем, стандарт TCP/IP позволяет системным разработчикам выбирать конкретные детали реализации API.
В настоящее время наиболее известными API-интерфейсами, доступными для приложений, использующих TCP/IP, являютсяинтерфейс сокета
Хотя сокет — это не физическая сущность, а абстракция, сокет — это структура данных, которая обеспечивает приложение для создания и использования.
4. Дескриптор сокета
Когда процесс приложения (клиент или сервер) должен использовать сеть для связи, он должен сначала выполнить системный вызов сокета, чтобы запросить у операционной системы создание для него «сокета». Фактический эффект этого вызова состоит в том, чтобы запросить у операционной системыСистемные ресурсы (пространство памяти, процессорное время, пропускная способность сети и т. д.)назначается процессу подачи заявки.
В сумме этих ресурсов операционная система используетномер дескриптора сокета (маленькое целое)для представления, а затем вернуть дескриптор сокета процессу приложения.
Схема связи сокета
Из рисунка видно, что связь по сокету неотделима от протокола TCP/IP.Для того, чтобы хост А и хост Б могли обмениваться данными, необходимо установить соединение по сокету.Чтобы установить соединение по сокету, необходимо установить соединение по протоколу TCP через базовый протокол TCP/IP.
Анализ протокола связи сокетов
Как упоминалось выше, связь через сокеты тесно связана с протоколом TCP/IP.Что касается связи при программировании через сокеты, у нас есть два протокола на выбор, то есть общий протокол TCP и протокол UDP.
UDP-протокол
Протокол UDP — это протокол без установления соединения, также известный как протокол дейтаграмм. Каждый раз, когда отправляется дейтаграмма, дескриптор сокета машины (то есть дескриптор сокета, упомянутый выше) и дескриптор сокета получателя должны быть отправлены одновременно. Таким образом, каждое сообщение должно отправлять дополнительные данные.
TCP-протокол
Протокол TCP является подключенным протоколом.Перед использованием приложения необходимо установить TCP-соединение. Поэтому каждый раз перед общением нам нужно сначала установить соединение сокета, сокет в качестве сервера для прослушивания запросов и сокет в качестве клиента для выполнения запросов на соединение. Только после того, как обе стороны установили соединение, они могут общаться.
Разница и выбор двух протоколов
Кратко проанализируйте разницу между ними:
- В UDP каждый раз при отправке дейтаграммы должны быть присоединены дескриптор сокета локальной машины и дескриптор сокета принимающей стороны. общение, то естьТрехстороннее рукопожатие TCP, поэтому для установления соединения потребуется некоторое время
- В UDP размер данных дейтаграммы ограничен 64 КБ. Хотя TCP не имеет таких ограничений, после установления пары сокетов для связи TCP они взаимодействуют как потоки ввода-вывода.
- UDP — ненадежный протокол, и отправленные дейтаграммы могут быть получены принимающим сокетом не в том порядке, в котором они были отправлены. А TCP — надежный протокол. Порядок пакетов, полученных получателем, примерно такой же, как порядок пакетов у отправителя (потеря пакетов здесь не обсуждается).
Кстати говоря, что касается того, какой протокол выбрать, это все еще зависит от вашего сценария использования.Конечно, есть больше соединений через сокеты, основанные на протоколе TCP. Конечно, некоторые сервисы с высокой производительностью в реальном времени и некоторые сервисы в локальной сети используют больше UDP.
Пример программирования Java Socket на основе протокола TCP
В целом программирование сокетов делится на три этапа: установление соединения, передача данных и разрыв соединения. Конечно, между конкретными шагами программы-сервера и программы-клиента есть некоторые различия, как показано на рисунке выше.
Здесь мы используем класс ServerSocket (используемый в основном для сервера) и класс Socket (используемый для установления соединения) в пакете java.net для реализации экземпляра связи Socket.
запись на стороне сервера
package com.pjmike.Socket;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLOutput;
/**
* 服务端
*
* @author pjmike
* @create 2018-08-12 17:43
*/
public class Server {
private ServerSocket serverSocket = null;
private Socket socket = null;
private DataInputStream input = null;
public Server(int port) {
try {
//绑定端口
System.out.println("bind port ...");
serverSocket = new ServerSocket(port);
System.out.println("Server started and waiting a client ..");
//调用accept()方法,提取连接请求
socket = serverSocket.accept();
//一般都是以字节传输
input = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String line = "";
while (!line.equals("exit")) {
try {
//readUTF()方法需要读取writeUTF()写过来的数据
line = input.readUTF();
System.out.println("recd: " + line);
} catch (IOException o) {
o.printStackTrace();
}
}
//关闭连接
System.out.println("connection closed ...");
input.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server(5000);
}
}
клиентская программа
package com.pjmike.Socket;
import java.io.*;
import java.net.Socket;
import java.nio.Buffer;
/**
* 客户端
*
* @author pjmike
* @create 2018-08-12 17:52
*/
public class Client {
private Socket socket = null;
private DataOutputStream output = null;
private BufferedReader input = null;
public Client(String address, int port) {
try {
//建立连接
socket = new Socket(address, port);
System.out.println("Connected ...");
//从控制台输入信息
input = new BufferedReader(new InputStreamReader(System.in));
output = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
String line = "";
while (!line.equals("exit")) {
try {
line = input.readLine();
System.out.println("客户端输入的是: "+line);
output.writeUTF(line);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
input.close();
socket.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client("localhost", 5000);
}
}
контрольная работа
клиент
Connected ...
hello world
客户端输入的是: hello world
nihao
客户端输入的是: nihao
exit
客户端输入的是: exit
Сервер
bind port ...
Server started and waiting a client ..
recd: hello world
recd: nihao
recd: exit
connection closed ...
Конечно, иногда нам также нужно, чтобы несколько клиентов подключались к одному и тому же серверу.
резюме
По сути, Socket — это механизм межпроцессного взаимодействия, который в программировании Java Socket также делится на три этапа: установление канала связи, передача данных и закрытие канала. Кроме того, сетевое программирование тесно интегрировано с операциями ввода-вывода Java, и знакомство с операциями ввода-вывода также необходимо.