Java Socket基础

介绍

Java Socket是一种用于实现网络通信的编程接口,它提供了一种机制,使得计算机网络中的两个程序可以进行数据交换。使用Java Socket可以轻松地创建客户端和服务器端,使它们能够在网络上相互通信。

本文将介绍Java Socket的基础知识和使用方法,并提供一些示例代码来演示其使用。

Socket基本概念

在开始之前,我们先来了解一些与Socket相关的基本概念。

  • IP地址:IP地址是用于标识网络上的计算机的唯一地址。在Java中,我们可以使用InetAddress类来表示IP地址。

  • 端口号:端口号是用于标识正在运行的进程或服务的数字。在Java中,端口号的取值范围是0到65535,其中0到1023为系统保留端口,需要特殊权限才能使用。

  • 服务端套接字(Server Socket):服务端套接字等待客户端套接字的连接请求。在Java中,我们可以使用ServerSocket类来创建服务端套接字。

  • 客户端套接字(Socket):客户端套接字是通过向服务端套接字发起连接请求来与服务端进行通信的。在Java中,我们可以使用Socket类来创建客户端套接字。

创建服务端套接字

下面是一个简单的Java代码示例,演示了如何使用ServerSocket类创建服务端套接字:

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

public class Server {

    public static void main(String[] args) {
        try {
            // 创建ServerSocket对象,并指定监听的端口号
            ServerSocket serverSocket = new ServerSocket(8888);
            
            // 等待客户端连接
            System.out.println("等待客户端连接...");
            Socket clientSocket = serverSocket.accept();
            
            // 连接成功
            System.out.println("客户端已连接:" + clientSocket.getInetAddress());
            
            // 关闭Socket连接
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码通过ServerSocket类的accept()方法等待客户端的连接请求。一旦有客户端连接上,就会创建一个Socket对象,表示与客户端的连接。

创建客户端套接字

下面是一个简单的Java代码示例,演示了如何使用Socket类创建客户端套接字并连接到服务端:

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

public class Client {

    public static void main(String[] args) {
        try {
            // 创建Socket对象,并指定服务端的IP地址和端口号
            Socket socket = new Socket("localhost", 8888);
            
            // 连接成功
            System.out.println("已连接到服务端:" + socket.getInetAddress());
            
            // 关闭Socket连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码通过Socket类的构造方法创建客户端套接字,并指定服务端的IP地址和端口号。一旦连接成功,就可以进行数据的发送和接收。

数据传输

一旦客户端与服务端建立了连接,就可以进行数据的传输了。Java提供了InputStreamOutputStream两个类来进行数据的读写操作。

下面是一个简单的Java代码示例,演示了客户端向服务端发送数据,并读取服务端的响应:

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 {
            Socket socket = new Socket("localhost", 8888);
            
            // 获取输出流,向服务端发送数据
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("Hello, Server!".getBytes());
            
            // 获取输入流,读取服务端的响应
            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int length = inputStream.read(buffer);
            String response = new String(buffer, 0, length);
            System.out.println("收到服务端的响应:" + response);
            
            socket.close();
        } catch (IOException e) {
            e.printStackTrace