Java Socket并发编程

1. 概述

在网络编程中,Socket是一种用于实现网络通信的一种机制。Java提供了Socket类和ServerSocket类,可以方便地进行Socket编程。在并发编程中,我们可以利用Java的多线程机制,实现多个客户端与服务器之间的并发通信。

本文将介绍如何使用Java Socket进行并发编程,主要包括以下内容:

  1. 整体流程
  2. 准备工作
  3. 创建服务器端
  4. 创建客户端
  5. 运行与测试

2. 整体流程

下表展示了Java Socket并发编程的整体流程:

步骤 说明
准备工作 导入所需的类和包,创建服务器Socket,设定服务器端口号
创建服务器端 使用多线程创建服务器端,接受并处理客户端的连接请求
创建客户端 通过Socket连接服务器端,实现与服务器的通信
运行与测试 分别运行服务器端和客户端,进行并发通信测试

3. 准备工作

在开始编写代码之前,我们需要导入Java所需的类和包,并创建服务器Socket和设定服务器端口号。代码如下:

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

public class Server {
    public static void main(String[] args) {
        int port = 8080; // 服务器端口号
        ServerSocket serverSocket = null;
        Socket socket = null;
        
        try {
            // 创建服务器Socket
            serverSocket = new ServerSocket(port);
            
            System.out.println("服务器已启动,等待客户端连接...");
            
            while (true) {
                // 接受客户端连接
                socket = serverSocket.accept();
                
                // 创建新线程处理客户端请求
                ServerThread serverThread = new ServerThread(socket);
                serverThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭服务器Socket
            try {
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4. 创建服务器端

为了实现并发处理客户端的连接请求,我们使用多线程创建服务器端。在服务器端代码中,我们需要创建一个ServerThread类,继承Thread类,并重写run()方法。该线程类用于处理客户端的连接请求和数据交互。代码如下:

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

public class ServerThread extends Thread {
    private Socket socket;
    
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    
    @Override
    public void run() {
        try {
            System.out.println("客户端" + socket.getInetAddress() + "已连接");
            
            // 获取输入流和输出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            
            // 读取客户端发送的数据
            String message = reader.readLine(); 
            
            // 向客户端发送响应数据
            writer.println("服务器已接收到数据:" + message);
            writer.flush();
            
            // 关闭输入流、输出流和Socket连接
            reader.close();
            writer.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 创建客户端

客户端用于与服务器进行通信,可以发送请求数据并接收服务器的响应数据。以下是客户端代码:

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

public class Client {
    public static void main(String[] args) {
        String serverIP = "127.0.0.1"; // 服务器IP地址
        int serverPort = 8080; // 服务器端口号
        
        try {
            // 连接服务器
            Socket socket = new Socket(serverIP, serverPort);
            
            // 获取输入流和输出流
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            
            // 向服务器发送数据
            writer.println("Hello Server");
            writer.flush();
            
            // 读取服务器响应数据
            String response = reader.readLine();
            System.out.println(response);
            
            // 关闭输入流、输出流和Socket连接
            reader.close();
            writer.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6. 运行与测试