逐行分析解释下面代码:import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); // 连接服务器 System.out.println("已连接服务器,IP地址为:" + socket.getInetAddress().getHostAddress()); // 为服务器创建读取器和写入器 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); // 启动一个线程来接收服务器发送的消息 Thread receiveThread = new Thread(() -> { try { while (true) { String message = reader.readLine(); if (message == null) { break; } System.out.println("服务器说:" + message); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); writer.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }); receiveThread.start(); // 主线程用于发送消息 BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String message = consoleReader.readLine(); writer.println(message); writer.flush(); } } catch (IOException e) { e.printStackTrace(); } } }
时间: 2024-01-07 07:03:36 浏览: 96
这段代码实现了一个简单的客户端,通过 Socket 连接到指定的服务器,并能够在控制台上进行消息的发送和接收。下面是代码的分析:
1. 导入必要的类:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
```
2. 定义主类 Client,并实现 main 方法:
```java
public class Client {
public static void main(String[] args) {
try {
// connect to server
Socket socket = new Socket("localhost", 8888);
System.out.println("已连接服务器,IP地址为:" + socket.getInetAddress().getHostAddress());
// create reader and writer for server
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
// start a thread to receive messages from server
Thread receiveThread = new Thread(() -> {
try {
while (true) {
String message = reader.readLine();
if (message == null) {
break;
}
System.out.println("服务器说:" + message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receiveThread.start();
// main thread for sending messages
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String message = consoleReader.readLine();
writer.println(message);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
3. 在 main 方法中,首先通过 Socket 类创建一个套接字连接到指定的服务器:
```java
Socket socket = new Socket("localhost", 8888);
```
其中,localhost 表示本机,8888 表示服务器端口号。
4. 创建一个 BufferedReader 对象来从服务器读取数据,以及一个 PrintWriter 对象来向服务器发送数据:
```java
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
```
5. 启动一个线程来接收服务器发送的消息:
```java
Thread receiveThread = new Thread(() -> {
try {
while (true) {
String message = reader.readLine();
if (message == null) {
break;
}
System.out.println("服务器说:" + message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receiveThread.start();
```
该线程通过循环读取 BufferedReader 对象中的数据,如果读到的数据为 null,则表示连接已经断开,因此跳出循环;否则,将读取到的数据打印在控制台上。当线程结束时,关闭 BufferedReader、PrintWriter 和 Socket 对象。
6. 在主线程中,使用 BufferedReader 对象来从控制台读取用户输入的消息,并通过 PrintWriter 对象向服务器发送消息:
```java
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String message = consoleReader.readLine();
writer.println(message);
writer.flush();
}
```
该循环会一直运行,直到用户输入 "exit" 为止。每次循环中,从控制台读取一行用户输入,然后用 PrintWriter 对象将消息发送给服务器。记得在每次发送消息之后,调用 flush() 方法将缓存中的数据写出到网络中。
7. 如果在连接过程中发生异常,则打印异常堆栈信息:
```java
} catch (IOException e) {
e.printStackTrace();
}
```
阅读全文