📅  最后修改于: 2023-12-03 15:37:36.188000             🧑  作者: Mango
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协议的网络通信,程序实现了简单的客户端-服务器对话,可以进行互相收发消息。双向通信可以满足对话式应用程序的需求。