当前位置: 首页 > news >正文

JAVA-网络编程套接字Socket

一.什么是套接字

在 Java 中,套接字(Socket)是一种用于实现网络通信的机制,它提供了一种在不同计算机之间进行数据传输的方式。

1.分类

  • 流套接字(Stream Socket)使用 TCP 协议,提供可靠的、面向连接的字节流通信。数据以连续的字节流形式传输,保证数据的顺序和完整性,适用于对数据准确性要求高的场景,如文件传输、HTTP 协议等。
  • 数据报套接字(Datagram Socket)使用 UDP 协议,提供无连接的、不可靠的数据报通信。数据以独立的数据包(数据报)形式传输,不保证数据的顺序和完整性,但具有较高的实时性,适用于对实时性要求高但能容忍一定数据丢失的场景,如视频会议、实时游戏等。

2.相关类

  • ServerSocket用于服务器端,创建一个监听特定端口的套接字,等待客户端连接。通过accept()方法阻塞等待客户端连接,一旦有客户端连接,就返回一个Socket对象用于与该客户端进行通信。
  • Socket客户端和服务器端在建立连接后,都使用Socket对象进行数据的读写操作。可以通过getInputStream()获取输入流读取数据,通过getOutputStream()获取输出流写入数据。

2.1 getInputStream() 和 getOutputStream() 

getInputStream() 和 getOutputStream() 是 Socket 类的重要方法

  • getInputStream()Socket 类的 getInputStream() 方法会返回一个 InputStream 对象,这个对象能够让程序从  与该 Socket 连接的另一端读取数据。当网络中的数据传输到本地时,就可以通过这个输入流把数据读取到程序里。
  • getOutputStream()getOutputStream() 方法返回一个 OutputStream 对象,程序可以使用这个对象向   与该 Socket 连接的另一端写入数据。当程序有数据需要发送到网络的另一端时,就可以通过这个输出流将数据发送出去。

 二.流套接字-代码示例

下面是一个简单的基于 TCP 协议的客户端 - 服务器通信示例

1.服务器端代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
1.客户端和服务器端建立连接
            / 创建一个监听端口号为888的服务器端套接字
            ServerSocket serverSocket = new ServerSocket(8888);
            /等待客户端连接(通过accept()方法阻塞等待)
            /一旦有客户端连接,就返回一个Socket对象用于与该客户端进行通信
            Socket socket = serverSocket.accept();

2.使用Socket对象进行数据的读写操作
            / 获取输入流读取数据.输出流写入数据
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();

3. 读取客户端发送过来的数据
            /创建了一个长度为 1024 的字节数组 buffer
            byte[] buffer = new byte[1024];
            /从输入流中读取数据到 buffer 数组中。
            该方法会返回实际读取到的字节数,将这个值赋给变量 length
            int length = inputStream.read(buffer);
            /将字节数组 buffer 中从索引 0 开始、长度为 length 的字节数据转换为字符串
            String message = new String(buffer, 0, length);
            /打印出来
            System.out.println("Received from client: " + message);

4. 向客户端发送响应数据
            String response = "Hello, client!";
            outputStream.write(response.getBytes());
5. 关闭资源
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.客户端代码 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
1.让客户端连接到服务器
            /创建客户端套接字,连接到服务器。指定服务器地址,服务器端口号
            /与本地服务器(localhost)的 8888 端口建立 TCP 连接
            Socket socket = new Socket("localhost", 8888);

2.使用socket对象进行数据的读写操作

            /获取输入流和输出流
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();
3. 向服务器发送数据
            String message = "Hello, server!";
            outputStream.write(message.getBytes());
4. 读取服务器响应的数据
            byte[] buffer = new byte[1024];
            int length = inputStream.read(buffer);
            String response = new String(buffer, 0, length);
            System.out.println("Received from server: " + response);
            // 关闭资源
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三.数据报套接字-代码示例 

简单的使用DatagramSocket发送和接收 UDP 数据包的示例。

UDPClientUDPServer发送了一条消息,UDPServer接收并打印了该消息

1.服务器端代码 

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {
    public static void main(String[] args) throws Exception {
       
        /创建一个监听端口号为888的服务器端UDP套接字
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] buffer = new byte[1024];
        /创建一个用于接收指定长度数据的数据包
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        /调用recive()方法接收数据-将接收到的数据填充到Packet中
        socket.receive(packet);
        /获取数据包中的数据字节数组,(从0开始到实际长度)
        String message = new String(packet.getData(), 0, packet.getLength());
        System.out.println("Received: " + message);
        // 关闭套接字
        socket.close();
    }
}

 2.客户端代码

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) throws Exception {
        / 创建一个客户端UDP套接字
        DatagramSocket socket = new DatagramSocket();
        String message = "Hello, Server!";//要发送的消息
        / 将消息转换为字节数组
        byte[] buffer = message.getBytes();
    /把数据封装到数据包里
    / 创建一个用于接收指定长度数据的数据包,且指定数据包要发送到的目标地址和端口号
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, 
       InetAddress.getByName("localhost"), 8888);
        / 发送数据
        socket.send(packet);
        / 关闭套接字
        socket.close();
    }
}

 四.DatagramSocket

是 Java 中用于表示 UDP 数据包的类

1.作用

适用场景:用于DatagramSocket中发送和接收数据时候

1.在发送数据时,需要将数据封装在DatagramPacket中,并指定目标地址和端口号;

2.在接收数据时,通过DatagramSocket对象的recieve( )方法将接收到的数据填充到DatagramPacket,通过它可以获取到数据内容、发送方的地址和端口号等信息。

2.构造方法

  • DatagramPacket(byte[] buf, int length):创建一个用于接收指定长度数据的数据包。
  • DatagramPacket(byte[] buf, int offset, int length):创建一个指定偏移量和长度的接收数据包。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port):创建一个用于发送数据的数据包,指定了目标地址和端口号。
  • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):创建一个指定偏移量、长度、目标地址和端口号的发送数据包。

3.主要方法

  • getAddress():获取数据包的发送方或接收方的 IP 地址。
  • getPort():获取数据包的发送方或接收方的端口号。
  • getData():获取数据包中的数据字节数组。
  • getLength():获取数据包中实际数据的长度

相关文章:

  • mysql增、删、改和单表查询多表查询
  • 印刷电路板 (PCB) 的影响何时重要?在模拟环境中导航
  • 基于ssm的医院预约挂号系统
  • fircrawl本地部署
  • (UI自动化测试web端)第二篇:元素定位的方法_css定位之class选择器
  • 【AI】Orin NX+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功
  • LinkedIn数据抓取零风险指南:亮数据住宅代理实现企业级合规采集
  • 深入解析 RedissonMultiLock —— 分布式联锁的原理与实战
  • 我的第二个网站 - SpellCheck Game
  • java学习——函数式编程(1)
  • HTML5前端第六章节
  • 扭蛋机小程序开发,潮玩娱乐消费风口下的机遇
  • 多模态自动驾驶混合渲染HRMAD:将NeRF和3DGS进行感知验证和端到端AD测试
  • 关于微信小程序云开发轮播图渲染失败问题
  • 第 8 章:使用更好的库_《C++性能优化指南》_notes
  • Win7触摸屏位置不准如何操作
  • Element UI实现表格全选、半选
  • 微信小程序引入TDesign组件后报错一直提示路径不对(Component is not found in path)的解决方法
  • k8s存储介绍(五)PV与PVC
  • Windows系统中,通过局域网共享文件夹让同一路由器下的其他设备访问文件
  • 中国海警舰艇编队5月14日在我钓鱼岛领海巡航
  • 山西省委常委李金科添新职
  • 韩国总统选战打响:7人角逐李在明领跑,执政党临阵换将陷入分裂
  • “应急侠”上线,应急管理部正式发布应急科普IP形象
  • 全国重点网络媒体和网络达人走进沧州,探寻“文武双全”的多重魅力
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开