JAVA-网络编程套接字Socket

目录

一.什么是套接字

1.分类

2.相关类

2.1 getInputStream() 和 getOutputStream() 

 二.流套接字-代码示例

1.服务器端代码

2.客户端代码 

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

1.服务器端代码 

 2.客户端代码

 四.DatagramSocket

1.作用

2.构造方法

3.主要方法


一.什么是套接字

在 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():获取数据包中实际数据的长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值