117.info
人生若只如初见

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.117.info/ask/fe761AzsNAgJRBg.html

推荐文章

  • java中异常类会影响性能吗

    在Java中,异常类本身不会对性能产生显著影响。异常处理机制是为了在程序运行时处理错误或异常情况,而不是为了优化性能。然而,在使用异常时,需要注意以下几点...

  • java中异常类如何避免

    在Java中,避免异常的最好方法是编写健壮的代码并遵循一些最佳实践。以下是一些建议: 预期和处理异常:使用try-catch语句来捕获和处理可能发生的异常。确保处理...

  • java中异常类有哪些常见类型

    Java中的异常类主要分为两大类:受检异常(Checked Exceptions)和非受检异常(Unchecked Exceptions)。以下是具体的异常类型:
    受检异常(Checked Except...

  • java中异常类怎么捕获

    在Java中,我们使用try-catch语句来捕获异常。当程序执行过程中遇到异常时,Java运行时系统会抛出一个异常对象。你可以使用try块来包含可能引发异常的代码,然后...

  • Android Service如何处理权限请求

    在Android中,Service通常用于在后台执行长时间运行的任务,而无需用户直接交互。然而,某些情况下,Service可能需要访问敏感权限,如访问位置、读取文件或网络通...

  • C# DataTable数据合并有哪些策略

    在C#中,DataTable数据合并的策略主要有以下几种: 使用Merge方法:这是最常用的合并策略之一。通过调用DataTable的Merge方法,可以将一个DataTable的内容合并到...

  • RecyclerView如何处理滚动事件

    在Android中,处理RecyclerView的滚动事件可以通过实现RecyclerView.OnScrollListener接口来完成 首先,在您的Activity或Fragment中创建一个RecyclerView实例: ...

  • ClassCastException异常如何预防

    ClassCastException是Java中常见的运行时异常,它通常发生在试图将对象强制转换为不兼容的类型时。为了避免这种异常,可以采取以下几种策略: 使用instanceof关键...