网络通信进化版

1TCP协议:类似已婚家庭可靠性高需要三次握手需要对方反馈是否收到若其中一端关闭服务端也会跟着关闭TCP比较专一(启动时要先开启服务端在开启客户端)

需要2端服务端(Server)


package org.example;

import java.io.DataInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

public static void main(String[]args)throws Exception {

System.out.println("----服务端启动成功-------" );

//创建Server对象,同时为服务端注册端口

        ServerSocket serverSocket=new ServerSocket(8888);

//        需要使用Server对象,使用一个accept方法,等待客户端的连接请求

        Socket socket=serverSocket.accept();

//        从socket通信管道中得到一个字节输入流

        InputStream is=socket.getInputStream();

//        把原始的字节输入流包装成数据输入流

        DataInputStream dis=new DataInputStream(is);

while (true) {

//        使用数据输入流读取客户端发送过来的消息

            try {

String rs=dis.readUTF();

System.out.println(rs);

//        获取客户端的IP地址

                System.out.println(socket.getRemoteSocketAddress());

}catch (IOException e) {

System.out.println(socket.getRemoteSocketAddress()+"离线了:");

dis.close();

socket.close();

break;

}

//            dis.close();

//            socket.close();

        }

}

}

客户端(Client)


import java.io.IOException;a

import java.io.OutputStream;

import java.net.Socket;

import java.util.Scanner;

public class Client {

public static void main(String[]args)throws Exception {

//        创建socket对象

        Socket socket=new  Socket("127.0.0.1",8888);

//        从socket通信管道中得到一个字节输出流,用来 发数据给服务程序.

        OutputStream os =socket.getOutputStream();

//把低级的字节输出流包装成数据输出流

        DataOutputStream dos =new DataOutputStream(os);

Scanner sc=new Scanner(System.in);

while (true) {

System.out.println("请输入");

String msg=sc.nextLine();

if ("exit".equals(msg)){

System.out.println("欢迎您下次光临,突出成功!");

break;

}

dos.writeUTF(msg);

dos.flush();

//        开始写数据出去了

//            dos.writeUTF("在一起,好吗?");

        }

//        dos.close();

//

//

//        socket.close();

    }

}

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它是互联网协议套件中的一部分,用于在网络上可靠地传输数据。

以下是 TCP 协议的一些关键特点:

面向连接:在通信之前,客户端和服务器之间建立一个连接。连接的建立包括三次握手过程,确保双方都准备好发送和接收数据。

可靠性:TCP 提供了可靠的数据传输。它通过序列号、确认应答和重传机制来确保数据的可靠性。如果发送方发送的数据包丢失或损坏,接收方会请求重传,直到数据正确接收为止。

流量控制:TCP 使用滑动窗口机制来进行流量控制。接收方可以通知发送方其可接收的数据量,以避免发送过多数据导致网络拥塞或接收方缓冲区溢出。

拥塞控制:TCP 通过拥塞窗口和拥塞避免算法来处理网络拥塞。当网络出现拥塞时,TCP 会降低发送速率以减轻网络负载,并且在逐渐增加发送速率时监测网络的拥塞情况。

面向字节流:TCP 是一种面向字节流的协议,它将数据视为连续的字节流,而不是分割成消息或数据包。因此,应用层协议需要定义消息的边界。

全双工通信:TCP 连接是全双工的,意味着客户端和服务器可以同时发送和接收数据,实现双向通信。

TCP 协议在许多网络应用中广泛使用,包括网页浏览、电子邮件、文件传输等。它提供了可靠的数据传输和连接管理,适用于需要确保数据完整性和可靠性的场景。

2UDP协议:类似舔狗 单相思 不惧可靠性只管发出不管对方是否接收 (启动时要先开启服务端在开启客户端)

服务端(Server)


package org.example;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

public static void main(String[]args) {

try {

ServerSocket serverSocket =new ServerSocket(8888);

System.out.println("服务端已启动,等待客户端连接...");

Socket socket =serverSocket.accept();

System.out.println("客户端已连接");

BufferedReader br =new BufferedReader(new InputStreamReader(socket.getInputStream()));

BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

BufferedReader consoleReader =new BufferedReader(new InputStreamReader(System.in));

new Thread(() -> {

String input;

try {

while ((input =br.readLine()) !=null) {

System.out.println("客户端:" +input);

}

}catch (Exception e) {

e.printStackTrace();

}

}).start();

String output;

while (true) {

System.out.print("服务端:");

output =consoleReader.readLine();

bw.write(output);

bw.newLine();

bw.flush();

}

}catch (Exception e) {

e.printStackTrace();

}

}

}

客户端(Client)


package org.example;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;

public class Client {

public static void main(String[]args) {

try {

Socket socket =new Socket("localhost",8888);

BufferedReader br =new BufferedReader(new InputStreamReader(socket.getInputStream()));

BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

BufferedReader consoleReader =new BufferedReader(new InputStreamReader(System.in));

new Thread(() -> {

String input;

try {

while ((input =br.readLine()) !=null) {

System.out.println("服务端:" +input);

}

}catch (Exception e) {

e.printStackTrace();

}

}).start();

String output;

while (true) {

System.out.print("客户端:");

output =consoleReader.readLine();

bw.write(output);

bw.newLine();

bw.flush();

}

}catch (Exception e) {

e.printStackTrace();

}

}

}

UDP(用户数据报协议)是一种无连接的、不可靠的、面向数据报的传输层协议。与TCP相比,UDP更加简单,因为它不提供连接状态跟踪、流量控制和拥塞控制等功能。UDP协议的特点包括:

无连接性:UDP是一种无连接的协议,也就是说在数据传输前不需要建立连接。每个数据包都是独立的,相互之间没有关联。

不可靠性:UDP不保证数据传输的可靠性。它不提供重传机制,如果数据包在传输过程中丢失、损坏或顺序错乱,UDP不会自动进行重传或纠正错误。

面向数据报:UDP是一种面向数据报的协议,意味着数据以数据包的形式进行传输。每个数据包都有固定的大小限制,超出限制的数据将被分割或丢弃。

低延迟:由于UDP不需要建立连接和维护连接状态,因此具有较低的延迟。这使得UDP适用于实时应用,如音频和视频流传输。

适用于广播和多播:UDP支持广播和多播传输,可以将数据包同时发送给多个接收方。

简单轻量:UDP的实现相对简单,开销较小。它不像TCP那样复杂,不需要维护连接状态和缓冲区,因此在某些情况下更适合要求轻量级通信的应用。

UDP常用于不需要可靠性保证的应用,如DNS查询、NTP时间同步、实时音视频传输等。在这些应用中,传输速度和实时性更为重要,而数据的丢失或错误可以通过应用层协议来处理

3HTTP协议:

HTTP(超文本传输协议)是一种用于传输超文本(如HTML)数据的应用层协议。它是互联网上应用最广泛的协议之一,用于在客户端和服务器之间传输和交换数据。以下是HTTP协议的一些关键特点:

无连接:HTTP是一种无连接的协议,每个请求-响应交换都是独立的,服务器不会保存客户端的连接状态。这意味着每个请求都是一个独立的事务,服务器处理完请求后即断开连接。

无状态:HTTP是一种无状态的协议,即服务器不会保存客户端的状态信息。每个请求都是相互独立的,服务器不会记住之前的请求或会话状态。为了维护状态,通常需要使用会话机制,如cookie或session。

基于请求-响应模型:HTTP通信采用请求-响应模型。客户端发送HTTP请求到服务器,服务器处理请求并返回HTTP响应给客户端。请求和响应包含了一些元数据(如头部信息)和可选的数据主体。

支持多种请求方法:HTTP定义了多种请求方法,包括GET、POST、PUT、DELETE等。每种方法有不同的语义,用于执行不同的操作,如获取资源、提交数据、更新资源等。

基于文本协议:HTTP使用文本格式进行通信,请求和响应都是由ASCII文本组成的。这使得HTTP消息易于阅读、调试和理解,但也增加了通信的开销。

无加密:HTTP本身不提供数据加密功能,传输的数据是明文的。为了安全传输敏感信息,可以使用HTTPS(HTTP Secure),它在HTTP上加入了SSL/TLS加密层。

HTTP被广泛用于Web浏览器和Web服务器之间的通信,用于获取网页、图像、视频等资源。除了Web浏览器,许多其他应用程序和服务也使用HTTP进行通信,如API接口、移动应用程序、IoT设备等。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容