📌  相关文章
📜  在Java中建立服务器和客户端之间的双向通信(1)

📅  最后修改于: 2023-12-03 15:37:36.188000             🧑  作者: Mango

在Java中建立服务器和客户端之间的双向通信

Java是一种非常流行的编程语言,它被广泛用于开发各种类型的应用程序。其中,建立服务器和客户端之间的双向通信是Java开发中的一个重要主题。本文将介绍如何使用Java编写服务器和客户端程序,并进行双向通信。

服务器端开发

服务器端程序通常在一个计算机上运行,用于处理客户端的请求。在Java中,可以使用Socket类来实现基于TCP协议的网络通信。以下是一个简单的Java服务器代码示例:

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

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket clientSocket = serverSocket.accept();
            
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port 8080 or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}

此代码会监听本地计算机的8080端口,当有客户端连接时,会创建一个Socket对象。程序使用PrintWriter和BufferedReader对象来收发数据,此代码仅回显客户端发送的信息。

客户端开发

客户端程序通常在另一个计算机上运行,用于向服务器发送请求并接收响应。以下是一个简单的Java客户端代码示例:

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

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("echo: " + in.readLine());
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host localhost");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to localhost");
            System.exit(1);
        }
    }
}

此代码会连接本地计算机的8080端口,并使用PrintWriter和BufferedReader对象来收发数据。程序使用System.in读取客户端输入,并通过socket向服务器发送请求。服务器将响应发送回客户端,客户端再将响应输出到控制台。

双向通信

在上述示例中,服务器和客户端之间只能进行单向通信。如果需要进行双向通信,可以在程序中同时使用input和output流。以下是一个简单的Java双向通信代码示例:

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

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket clientSocket = serverSocket.accept();
            
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String inputLine, outputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Client: " + inputLine);
                if (inputLine.equals("Bye.")) {
                    break;
                }
                outputLine = stdIn.readLine();
                if (outputLine != null) {
                    System.out.println("Server: " + outputLine);
                    out.println(outputLine);
                }
            }
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port 8080 or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String userInput, serverResponse;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                if ((serverResponse = in.readLine()) != null) {
                    System.out.println("Server: " + serverResponse);
                }
                if (userInput.equals("Bye.")) {
                    break;
                }
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host localhost");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to localhost");
            System.exit(1);
        }
    }
}

此代码示例中,服务器和客户端程序都使用了input和output流。程序实现了简单的客户端-服务器对话,可以进行互相收发消息。

双向通信可以满足对话式应用程序的需求。例如,聊天程序等需要实时回显用户输入的应用程序。

结论

本文介绍了如何使用Java编写服务器和客户端程序,并进行双向通信。程序中使用了Socket类来实现基于TCP协议的网络通信,程序实现了简单的客户端-服务器对话,可以进行互相收发消息。双向通信可以满足对话式应用程序的需求。