IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络编程-Socket -> 正文阅读

[网络协议]网络编程-Socket

一、OSI七层协议

先上图,HTTP和HTTPS在应用层
在这里插入图片描述

二、Socket

1、什么是Socket

  • 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定
  • Socket所支持的协议种类也不光TCP/IP、UDP,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程
  • socket连接就是所谓的长连接,客户端和服务器需要互相连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉的,但是有时候网络波动还是有可能的
  • Socket偏向于底层。一般很少直接使用Socket来编程,框架底层使用Socket比较多

2、 Socket通讯的过程

  • 基于TCP
    服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
  • 基于UDP
    UDP 协议是用户数据报协议的简称,也用于网络数据的传输。虽然 UDP 协议是一种不太可靠的协议,但有时在需要较快地接收数据并且可以忍受较小错误的情况下,UDP 就会表现出更大的优势。客户端只需要发送,服务端能不能接收的到我不管

2.1、TCP协议Socket代码实现:

  1. 服务端
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP协议Socket使用BIO进行通行:服务端
 *
 * @Auther: curry
 * @Date: 2022/01/27/16:30
 * @Description:
 */
public class Server {

    public static void main(String[] args) {
        //1单线程服务
        ServerSocket server = null;
        Socket socket = null;
        InputStream in = null;
        OutputStream out = null;

        try {
            server = new ServerSocket(8000);
            System.out.println("服务端启动成功,监听端口为8000,等待客户端连接...");
            while (true){
                socket = server.accept(); //等待客户端连接
                System.out.println("客户连接成功,客户信息为:" + socket.getRemoteSocketAddress());
                in = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                
                //读取客户端的数据
                while ((len = in.read(buffer)) > 0) {
                    System.out.println(new String(buffer, 0, len));
                }

                //向客户端写数据
                out = socket.getOutputStream();
                out.write("hello!".getBytes());

            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

  1. 客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * TCP协议Socket:客户端
 *
 * @Auther: curry
 * @Date: 2022/01/27/16:40
 * @Description:
 */
public class Client {

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

        //创建套接字对象socket并封装ip与port
        Socket socket = new Socket("127.0.0.1", 8000);

        //根据创建的socket对象获得一个输出流
        OutputStream outputStream = socket.getOutputStream();

        //控制台输入以IO的形式发送到服务器
        System.out.println("TCP连接成功 \n请输入:");

        while (true){
            byte[] car = new Scanner(System.in).nextLine().getBytes();
            outputStream.write(car);
            System.out.println("TCP协议的Socket发送成功");
            //刷新缓冲区
            outputStream.flush();
        }
    }
}
  1. 先运行服务端,在运行客户端 。测试结果发送成功
  • 客户端发送消息
    在这里插入图片描述
  • 服务端监听收到消息
    在这里插入图片描述

2.2、UDP协议Socket代码实现:

  1. 服务端
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 *UDP协议Socket:服务端
 *
 * @Auther: curry
 * @Date: 2022/01/27/16:51
 * @Description:
 */
public class Server1 {

    public static void main(String[] args) {

        try {
            //DatagramSocket代表声明一个UDP协议的Socket
            DatagramSocket socket = new DatagramSocket(8080);

            //byte数组用于数据存储
            byte[] car = new byte[1024];

            //DatagramPacket 类用来表示数据报包DatagramPacket
            DatagramPacket packet = new DatagramPacket(car, car.length);

            //创建DatagramPacket的receive()方法来进行数据的接收,等待接收一个socket的请求后才执行后续操作
            System.out.println("等待UDP协议传输数据");
            socket.receive(packet);

            //packet.getLength返回将要发送或者接收的数据的长度
            int length = packet.getLength();

            System.out.println("有数据来了===:" + new String(car, 0, length));
            socket.close();
            System.out.println("UDP协议Socket接受成功");

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}


  1. 客户端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

/**
 * UDP协议Socket:客户端
 *
 * @Auther: curry
 * @Date: 2022/01/27/16:52
 * @Description:
 */
public class Client1 {

    public static void main(String[] args) {

        try {
            //DatagramSocket代表声明一个UDP协议的Socket
            DatagramSocket socket = new DatagramSocket(8080);

            //字符串存储人Byte数组
            byte[] car = "UDP协议的Socket请求,有可能失败哟".getBytes();

            //InetSocketAddress类主要作用是封装端口
            InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8080);

            //DatagramPacket 类用来表示数据报包DatagramPacket
            DatagramPacket packet = new DatagramPacket(car, car.length);

            //send() 方法发送数据包
            socket.send(packet);
            System.out.println("UDP协议的Socket发送成功");
            socket.close();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
  1. 先运行服务端,在运行客户端 。测试结果发送成功

在这里插入图片描述

3、Socket的常用类

类名用于作用
SocketTCP协议Socket类同时工作于客户端和服务端,所有方法都是通用的,这个类三个主要作用,校验包信息,发起连接(Client),操作流数据(Client/Server)
ServerSocketTCP协议ServerSocket表示为服务端,主要作用就是绑定并监听一个服务器端口,为每个建立连接的客户端“克隆/映射”一个Socket对象,具体数据操作都是通过这个Socket对象完成的,ServerSocket只关注如何和客户端建立连接
DatagramSocketUDP协议DatagramSocket 类用于表示发送和接收数据报包的套接字
DatagramPacketUDP协议DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务
InetAddressIP+端口号Java提供了InetAddress类来代表互联网协议(IP)地址,InetAddress类没有提供构造器,而是提供了如下两个静态方法来获取InetAddress实例
InetSocketAddressIP+端口号在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中并未提供这种方式,而是靠SocketAddress的子类InetSocketAddress来实现 IP 地址 + 端口号的创建,不依赖任何协议
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:18:36  更:2022-01-28 12:19:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:51:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码