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 pack()方法在不同操作系统下的表现

    pack() 方法是 Java GUI 编程中的一个方法,用于调整窗口(如 JFrame)的大小以适应其内容。这个方法的行为可能会因操作系统而异,因为不同的操作系统可能有不同...

  • 如何优化Java pack()方法的性能

    pack() 方法是 Java GUI 编程中用于缩小窗口大小以适应其子组件所需空间的方法。要优化 pack() 方法的性能,可以尝试以下方法: 调用 pack() 方法的次数:尽量减...

  • Java pack()方法返回值的含义

    pack() 方法是 Java 中 java.awt.Window 类的一个方法,用于将窗口调整为其首选大小。这个方法没有返回值(返回类型为 void)。当你调用 pack() 方法时,窗口会自...

  • pack()方法在Java GUI编程中的应用

    pack()方法在Java GUI编程中主要用于设置窗口的大小,使其根据组件的首选大小进行调整。这个方法是在java.awt.Window类中定义的,因此所有继承自Window类的GUI组...

  • 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关键...