Java多线程编程实现socket通信示例代码

Java多线程编程实现socket通信是一种常见的方式,通常用于编写网络服务器程序。本文将提供一个完整的攻略,首先介绍Java多线程编程的概述,然后描述如何使用Java多线程编程实现socket通信,最后给出两个示例代码。

概述

多线程编程是一种同时执行多个任务的编程技术。Java是一种多线程支持的编程语言,具有良好的多线程支持。Java多线程编程允许程序同时执行多个任务,提高程序的性能。

Socket通信是一种面向网络通信的技术,用于在网络上传输数据。Java提供了Socket类和ServerSocket类来实现Socket通信。

Java多线程编程实现Socket通信

Java多线程编程可以很好地支持Socket通信。使用多线程编程可以实现同时处理多个客户端的请求。基本的步骤如下:

  1. 创建ServerSocket并绑定端口。

  2. 循环调用accept()方法来监听客户端的连接请求。

  3. 对于每个连接请求,创建一个新的线程来处理。

  4. 在每个线程中,调用Socket.getInputStream()方法来获取客户端发送的数据,并将结果发送回客户端。

下面给出两个示例代码,第一个示例实现了一个简单的计算器服务,客户端可以通过Socket向服务端发送计算表达式并获取计算结果。第二个示例实现一个简单的聊天室,客户端可以在聊天室中发送消息和接收其他客户端的消息。

示例1:计算器服务

  1. 服务端代码:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class CalculatorServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("Calculator server started...");

        // 循环监听客户端连接请求
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("Client connected from " + socket.getInetAddress());

            // 创建一个新线程来处理客户端请求
            Thread thread = new CalculatorThread(socket);
            thread.start();
        }
    }
}

class CalculatorThread extends Thread {
    private Socket socket;

    public CalculatorThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            // 读取客户端发送的计算表达式
            String expr = SocketUtil.readLine(socket.getInputStream());
            System.out.println("Received expression: " + expr);

            // 计算表达式并返回结果
            int result = Calculator.calculate(expr);
            SocketUtil.writeLine(socket.getOutputStream(), Integer.toString(result));
            System.out.println("Sent result: " + result);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class Calculator {
    public static int calculate(String expr) {
        // 解析表达式并计算结果
        return eval(expr);
    }

    private static int eval(String expr) {
        // 实现表达式的解析和计算
        return 0;
    }
}

class SocketUtil {
    public static void writeLine(OutputStream out, String line) throws IOException {
        out.write((line + "\n").getBytes());
    }

    public static String readLine(InputStream in) throws IOException {
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        while (true) {
            int b = in.read();
            if (b == -1) {
                throw new EOFException("End of input");
            }
            if (b == '\n') {
                break;
            }
            buf.write(b);
        }
        return buf.toString();
    }
}

该示例中使用ServerSocket来监听客户端连接请求,并为每个客户端连接创建一个新的线程。每个线程用于处理客户端发送的计算表达式,计算结果并将结果返回给客户端。

2.客户端代码:

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

public class CalculatorClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 1234);
        System.out.println("Connected to calculator server");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // 循环读取用户输入的计算表达式
        while (true) {
            System.out.print("Enter an expression (or \"quit\" to exit): ");
            String expr = reader.readLine();
            if ("quit".equals(expr)) {
                break;
            }

            // 向服务器发送计算表达式并读取结果
            SocketUtil.writeLine(socket.getOutputStream(), expr);
            String result = SocketUtil.readLine(socket.getInputStream());
            System.out.println("Result: " + result);
        }

        socket.close();
        System.out.println("Disconnected from calculator server");
    }
}

该示例中客户端通过Socket向服务端发送计算表达式并获取计算结果,运行示例前需要先启动服务端。

示例2:聊天室

  1. 服务端代码:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {
    private static List<ChatThread> threads = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("Chat server started...");

        // 循环监听客户端连接请求
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("Client connected from " + socket.getInetAddress());

            // 创建一个新线程来处理客户端请求
            ChatThread thread = new ChatThread(socket);
            threads.add(thread);
            thread.start();
        }
    }

    public static void broadcast(String message) {
        // 广播消息给所有客户端
        for (ChatThread thread : threads) {
            thread.sendMessage(message);
        }
    }

    public static void removeThread(ChatThread thread) {
        // 从列表中移除线程
        threads.remove(thread);
    }
}

class ChatThread extends Thread {
    private Socket socket;
    private String username;

    public ChatThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            // 读取客户端发送的用户名
            username = SocketUtil.readLine(socket.getInputStream());
            System.out.println("User " + username + " logged in");

            // 广播欢迎消息
            ChatServer.broadcast(username + " joined the chat");

            // 循环读取客户端发送的消息并广播给其他客户端
            while (true) {
                String message = SocketUtil.readLine(socket.getInputStream());
                ChatServer.broadcast(username + ": " + message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            ChatServer.removeThread(this);
            ChatServer.broadcast(username + " left the chat");
        }
    }

    public void sendMessage(String message) {
        // 发送消息给该客户端
        try {
            SocketUtil.writeLine(socket.getOutputStream(), message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该示例中使用ServerSocket来监听客户端连接请求,并为每个客户端连接创建一个新的线程。每个线程用于循环读取客户端发送的消息并广播给其他客户端。

  1. 客户端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ChatClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 1234);
        System.out.println("Connected to chat server");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // 读取用户输入的用户名
        System.out.print("Enter your username: ");
        String username = reader.readLine();

        // 发送用户名给服务器并启动一个新线程来循环读取消息
        SocketUtil.writeLine(socket.getOutputStream(), username);
        Thread thread = new Thread(new ChatReader(socket));
        thread.start();

        // 循环读取用户输入的消息并发送给服务器
        while (true) {
            String message = reader.readLine();
            SocketUtil.writeLine(socket.getOutputStream(), message);
        }
    }
}

class ChatReader implements Runnable {
    private Socket socket;

    public ChatReader(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            // 循环读取来自服务器的消息并输出到控制台
            while (true) {
                String message = SocketUtil.readLine(socket.getInputStream());
                System.out.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该示例中客户端可以在聊天室中发送消息和接收其他客户端的消息,运行示例前需要先启动服务端。

以上就是Java多线程编程实现socket通信的完整攻略介绍,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程编程实现socket通信示例代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • IDEA启动tomcat控制台中文乱码问题的解决方法(100%有效)

    那我们来详细讲解一下“IDEA启动tomcat控制台中文乱码问题的解决方法(100%有效)”的攻略。 问题描述 在使用IDEA启动Tomcat进行开发时,控制台显示的中文文字都是乱码,导致开发者无法正常查看调试过程,给开发带来了不必要的困扰。 原因分析 这个问题的根本原因在于控制台编码与系统编码不匹配。Tomcat在启动时会默认使用系统编码,在Windows…

    Java 2023年5月19日
    00
  • 基于JSP的RSS阅读器的设计与实现方法(推荐)

    基于JSP的RSS阅读器的设计与实现方法 简介 本篇攻略介绍如何使用JSP语言开发一个简单的RSS阅读器。RSS是一种将网站内容以XML格式传递的标准格式。通过使用本篇攻略中的技术,您将能够构建一个具有基本功能的RSS阅读器,包括展示RSS源,获取RSS源更新等功能。 准备工作 在开始之前,我们需要进行一些准备工作: 确保您已经安装了Java和Apache …

    Java 2023年6月15日
    00
  • SpringMVC中重定向model值的获取方式

    在SpringMVC中,重定向到页面时,我们想要将一些值传递给下一个页面,这些值需要被设置在model中。下面是完整攻略: 1. 在Controller中设置重定向的model值 在Controller中设置model值并将请求重定向到另一个页面时,我们需要使用RedirectAttributes接口。可以使用addAttribute()方法将值添加到mod…

    Java 2023年6月16日
    00
  • Java中JDBC连接数据库详解

    Java中JDBC连接数据库详解 JDBC是Java Database Connectivity的缩写,可以用于连接不同类型的数据库(如MySQL、Oracle等),并进行数据库操作。本篇文章将详细讲解如何在Java中使用JDBC连接数据库。 步骤1:加载JDBC驱动 在使用JDBC连接数据库之前,需要加载相应的数据库驱动。例如,如果要连接MySQL数据库,…

    Java 2023年5月19日
    00
  • 浅谈Java8新特性Predicate接口

    浅谈Java8新特性Predicate接口 Java 8中新增加了Predicate接口,它定义了一个输入参数和返回值都为Boolean的函数。这个接口定义了许多实用的方法,可以被用来组合复杂的布尔逻辑。 Predicate接口定义 Predicate接口有一个test方法,返回一个Boolean类型,其定义如下: @FunctionalInterface …

    Java 2023年5月26日
    00
  • jdk8的datetime时间函数使用示例

    下面我来详细讲解一下“jdk8的datetime时间函数使用示例”的完整攻略。 JDK8的DateTime时间函数使用示例 1. DateTime创建对象 在JDK8之前,Java的日期和时间的API非常难用和陈旧,但在JDK8中,Java提供了一个全新的日期和时间API(java.time),它提供了一种更简单、更易于使用和更安全的方式来处理日期和时间。 …

    Java 2023年5月20日
    00
  • JAVA如何调用Shell脚本

    Java 调用 Shell 脚本可以通过 Java 的 Runtime 类或者 ProcessBuilder 类来实现。 通过 Runtime 类调用 Shell 脚本 Java Runtime 类提供了访问 Java 应用程序运行时环境的方法。下面是通过 Runtime 类调用 Shell 脚本的示例代码: import java.io.BufferedR…

    Java 2023年5月26日
    00
  • Maven build 命令介绍的使用详解

    Maven build 命令介绍的使用详解 Maven是一个Java项目的自动化构建工具,用于搭建、构建、测试和部署Java应用程序。它是Java世界中非常流行的构建工具,由于其依赖关系管理,传递依赖的下载,插件机制等功能,使得Java项目的构建变得更加简单和自动化。 在Maven中,mvn命令是我们最常用的命令之一,该命令被用于在项目中执行诸如编译、测试、…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部