legongju.com
我们一直在努力
2024-12-28 13:05 | 星期六

java socket编程如何实现双向通信

在Java中,使用Socket编程实现双向通信需要创建两个线程,一个用于客户端发送数据,另一个用于服务器接收数据。以下是一个简单的示例,展示了如何使用Java Socket实现双向通信。

  1. 服务器端代码(Server.java):
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        int port = 12345;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server is listening on port " + port);

        Socket socket = serverSocket.accept();
        System.out.println("Client connected");

        // 创建两个线程,分别用于读取客户端发送的数据和向客户端发送数据
        Thread readerThread = new Thread(new ClientReader(socket));
        Thread writerThread = new Thread(new ClientWriter(socket));

        readerThread.start();
        writerThread.start();
    }
}

class ClientReader implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Received from client: " + inputLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ClientWriter implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
            String response;
            while ((response = "Server response: ".readLine()) != null) {
                out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 客户端代码(Client.java):
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int port = 12345;

        Socket socket = new Socket(serverAddress, port);
        System.out.println("Connected to server");

        // 创建两个线程,分别用于向服务器发送数据和接收服务器的响应
        Thread senderThread = new Thread(new ServerSender(socket));
        Thread receiverThread = new Thread(new ServerReceiver(socket));

        senderThread.start();
        receiverThread.start();
    }
}

class ServerSender implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
            String message;
            while ((message = "Client message: ".readLine()) != null) {
                out.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ServerReceiver implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Received from server: " + inputLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,服务器监听指定端口(例如12345),当客户端连接到服务器时,服务器会创建两个线程,一个用于读取客户端发送的数据,另一个用于向客户端发送数据。客户端也创建了两个线程,一个用于向服务器发送数据,另一个用于接收服务器的响应。这样,客户端和服务器就可以通过这两个线程实现双向通信。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/66734.html

相关推荐

  • String类在Java中的实现

    String类在Java中的实现

    在Java中,String类的实现主要涉及到字符数组和字符的不可变性。String类提供了一系列方法来操作字符串,如获取长度、获取指定索引的字符、拼接字符串、替换字符...

  • Java成员变量静态字段初始化规则是什么

    Java成员变量静态字段初始化规则是什么

    在Java中,静态字段的初始化规则主要遵循以下几个原则: 静态字段属于类:静态字段(static field)也被称为类变量,它们属于类本身而不是类的实例。因此,静态字...

  • Java成员变量静态内部类作用是什么

    Java成员变量静态内部类作用是什么

    Java中的静态内部类(也称为静态嵌套类)是一种特殊的内部类,它不依赖于外部类的实例。静态内部类的主要作用有以下几点: 实现封装和隐藏实现细节:静态内部类可...

  • Java成员变量静态资源访问方式是什么

    Java成员变量静态资源访问方式是什么

    在Java中,静态成员变量(包括静态变量和静态代码块)是属于类的,而不是属于某个特定的对象实例。因此,可以通过类名直接访问静态成员变量,而不需要创建类的实...

  • java socket编程能进行数据压缩吗

    java socket编程能进行数据压缩吗

    是的,Java Socket编程可以进行数据压缩。在Java中,你可以使用java.util.zip包中的类来实现数据压缩和解压缩。这些类提供了Deflater和Inflater两个主要的类,分...

  • java socket编程怎样处理异常断开

    java socket编程怎样处理异常断开

    在Java Socket编程中,处理异常断开的关键是捕获并处理可能出现的异常。以下是一些建议: 使用try-catch语句捕获异常:在可能抛出异常的代码块中使用try-catch语...

  • java socket编程在性能上如何优化

    java socket编程在性能上如何优化

    Java Socket编程在性能上的优化可以从多个方面进行,以下是一些建议: 使用合适的数据结构和算法:在处理数据时,选择合适的数据结构和算法可以显著提高性能。例...

  • java socket编程能确保数据传输安全吗

    java socket编程能确保数据传输安全吗

    Java Socket 编程本身并不能确保数据传输的安全性。为了确保数据传输的安全性,你需要采用一些额外的安全措施,例如使用 SSL/TLS 协议进行加密通信。
    SSL(...