欢迎访问宙启技术站
智能推送

Java网络编程函数:Socket和ServerSocket的用法介绍

发布时间:2023-06-06 01:01:25

Socket和ServerSocket是Java网络编程中的重要函数,用于实现基于TCP/IP协议的客户端与服务端通信。本文将详细介绍它们的用法。

1. Socket

Socket是一种可靠的TCP/IP连接。在Java应用程序中使用Socket可以创建一个客户端连接到指定的服务器端口并与之通信。Socket类的常用方法如下:

1) 构造函数:

Socket(String host, int port):创建一个Socket对象,并绑定到指定的主机号和端口号。

2) 通信接口:

void close():关闭该Socket及其相关流和套接字。

InputStream getInputStream():获取Socket的输入流。

OutputStream getOutputStream():获取Socket的输出流。

void setSoTimeout(int timeout):设置Socket的超时时间。

3) 流操作:

int read(byte[] b):读取指定字节数组的数据(会阻塞)。

int read(byte[] b, int off, int len):从指定位置读取指定长度的数据(会阻塞)。

int read():从输入流中读取一个字节(会阻塞)。

void write(byte[] b):写入指定字节数组的数据。

void write(byte[] b, int off, int len):从指定位置写入指定长度的数据。

void write(int b):向输出流中写入一个字节。

2. ServerSocket

ServerSocket是一个侦听传入TCP连接请求的类。ServerSocket类的常用方法如下:

1) 构造函数:

ServerSocket(int port):使用指定端口号创建一个ServerSocket对象。

2) 通信接口:

Socket accept():侦听并接受连接,返回一个新的Socket对象。

3) 配置操作:

void setSoTimeout(int timeout):设置ServerSocket的超时时间。

void setReuseAddress(boolean on):启用/禁用ServerSocket的地址复用。

使用ServerSocket可以实现多线程服务器的编写,具体实现方法如下:

1) 创建ServerSocket对象,指定服务端口。

2) 创建一个线程池,用于并发处理客户端请求。

3) 在主线程中建立循环,调用ServerSocket的accept()方法监听客户端请求连接。

4) 当有客户端请求连接时,将Socket传入处理线程池中运行并处理客户端请求,并继续等待下一个客户端连接。

示例代码如下:

public class Server {
    private ServerSocket serverSocket;
    private ExecutorService executorService; // 线程池
    
    public Server(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        executorService = Executors.newCachedThreadPool(); // 初始化线程池
        System.out.println("Server started.");
    }
    
    public void service() {
        while (true) {
            try {
                Socket socket = serverSocket.accept(); // 监听客户端连接请求
                executorService.submit(new Handler(socket)); // 提交处理线程到线程池执行
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        Server server = new Server(8000);
        server.service();
    }
}

class Handler implements Runnable {
    private Socket socket;
    
    public Handler(Socket socket) {
        this.socket = socket;
    }
    
    @Override
    public void run() {
        try {
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();
            // 处理客户端请求...
            inputStream.close();
            outputStream.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上就是Socket和ServerSocket的用法介绍,希望对读者有所帮助。