一、前言

Java套接字编程用于不同JRE上运行的应用程序之间进行通信,可以是面向连接或无连接的。Socket类和ServerSocket类用于面向连接的套接字编程,DatagramSocket类和DatagramPacket类用于无连接的套接字编程。我们需要根据服务器IP地址和端口号来区分套接字。Socket类用于客户端和服务器之间的通信,我们可以读取和写入消息。ServerSocket类用于服务器端。

二、方法介绍

Socket类

方法

描述

getInputStream()

返回此套接字的InputStream

getOutputStream()

返回此套接字的OutputStream

close()

关闭这个套接字

ServerSocket类

方法

描述

accept()

返回套接字并在服务器和客户端之间建立连接

close()

关闭服务器套接字

三、单向通信

服务端

package learn;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author qx
 * @date 2024/1/18
 * @des Socket服务端
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        // 建立连接 用于客户端和服务端之间的通信
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String data = dis.readUTF();
        System.out.println("message=" + data);
        serverSocket.close();
    }
}

客户端

package learn;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 * @author qx
 * @date 2024/1/18
 * @des Socket客户端
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        // 连接服务端
        Socket socket = new Socket("localhost", 8888);
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        // 发送数据
        dos.writeUTF("hello world");
        dos.flush();
        dos.close();
    }
}

我们先启动服务端接收来着客户端的数据,然后启动客户端发送数据。

Java套接字编程学习_Socket

然后启动客户端

Java套接字编程学习_Socket_02

最后我们在服务端的控制台接收到来着客户端发送的数据。

Java套接字编程学习_Socket_03

四、双向通信

具体的流程是客户端向服务端写入数据,服务端接收并打印该数据,然后向客户端写入数据,客户端接收数据并打印该数据。

服务端

package learn;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author qx
 * @date 2024/1/18
 * @des Socket服务端
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        // 建立连接 用于客户端和服务端之间的通信
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();

        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = "", str2 = "";
        while (!"stop".equals(str)) {
            str = dis.readUTF();
            System.out.println("client say:" + str);
            str2 = br.readLine();
            dos.writeUTF(str2);
            dos.flush();
        }
        dis.close();
        socket.close();
        serverSocket.close();
    }
}

客户端

package learn;

import java.io.*;
import java.net.Socket;

/**
 * @author qx
 * @date 2024/1/18
 * @des Socket客户端
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        // 连接服务端
        Socket socket = new Socket("localhost", 8888);
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = "", str1 = "";
        while (!"stop".equals(str)) {
            str1 = br.readLine();
            dos.writeUTF(str1);
            dos.flush();

            str = dis.readUTF();
            System.out.println("server says:" + str);

        }
        dos.close();
        socket.close();
    }
}

我们和之前一样先启动服务端接收数据,然后启动客户端。在客户端输入要发送的消息。

Java套接字编程学习_Socket_04

服务端接收到来着客户端的消息。

Java套接字编程学习_Socket_05

然后服务端输入并发送消息给客户端。

Java套接字编程学习_Socket_06

客户端接收到服务端的消息并打印。

Java套接字编程学习_Socket_07

结束通信:

客户端输入stop结束通信。

Java套接字编程学习_Socket_08

服务端接收到stop消息,并发送stop消息,停止服务端。

Java套接字编程学习_Socket_09

最后客户端接收到stop消息,停止客户端。

Java套接字编程学习_Socket_10