面试题答案
一键面试TCP服务器端实现步骤:
- 创建ServerSocket对象:
- 代码示例:
ServerSocket serverSocket = new ServerSocket(8888);
- 解释:
ServerSocket
类用于创建服务器端套接字,构造函数中的参数指定服务器监听的端口号。
- 代码示例:
- 监听客户端连接:
- 代码示例:
Socket clientSocket = serverSocket.accept();
- 解释:
accept()
方法是阻塞方法,等待客户端连接。当有客户端连接时,返回一个代表该客户端的Socket
对象。
- 代码示例:
- 获取输入输出流:
- 获取输入流:
- 代码示例:
InputStream inputStream = clientSocket.getInputStream();
- 解释:通过
Socket
对象的getInputStream()
方法获取输入流,用于读取客户端发送的数据。
- 代码示例:
- 获取输出流:
- 代码示例:
OutputStream outputStream = clientSocket.getOutputStream();
- 解释:通过
Socket
对象的getOutputStream()
方法获取输出流,用于向客户端发送数据。
- 代码示例:
- 获取输入流:
- 数据传输:
- 读取数据:
- 代码示例:
- 读取数据:
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String message = new String(buffer, 0, length);
- **解释**:使用输入流的`read()`方法读取数据到字节数组`buffer`中,`read()`方法返回读取的字节数。然后将字节数组转换为字符串。
- **发送数据**:
- **代码示例**:`outputStream.write("Hello, Client!".getBytes());`
- **解释**:将要发送的字符串转换为字节数组,通过输出流的`write()`方法发送数据。
5. 关闭连接: - 代码示例:
inputStream.close();
outputStream.close();
clientSocket.close();
serverSocket.close();
- **解释**:依次关闭输入流、输出流、客户端`Socket`和服务器端`ServerSocket`,释放资源。
TCP客户端实现步骤:
- 创建Socket对象:
- 代码示例:
Socket socket = new Socket("localhost", 8888);
- 解释:
Socket
类用于创建客户端套接字,构造函数中第一个参数指定服务器的IP地址(这里使用localhost
表示本地主机),第二个参数指定服务器监听的端口号。
- 代码示例:
- 获取输入输出流:
- 获取输入流:
- 代码示例:
InputStream inputStream = socket.getInputStream();
- 解释:同服务器端获取输入流解释,用于读取服务器端发送的数据。
- 代码示例:
- 获取输出流:
- 代码示例:
OutputStream outputStream = socket.getOutputStream();
- 解释:同服务器端获取输出流解释,用于向服务器端发送数据。
- 代码示例:
- 获取输入流:
- 数据传输:
- 发送数据:
- 代码示例:
outputStream.write("Hello, Server!".getBytes());
- 解释:同服务器端发送数据解释,将字符串转换为字节数组通过输出流发送。
- 代码示例:
- 读取数据:
- 代码示例:
- 发送数据:
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String message = new String(buffer, 0, length);
- **解释**:同服务器端读取数据解释,从输入流读取数据到字节数组并转换为字符串。
4. 关闭连接: - 代码示例:
inputStream.close();
outputStream.close();
socket.close();
- **解释**:关闭输入流、输出流和客户端`Socket`,释放资源。
关键类和方法总结:
- ServerSocket:用于服务器端监听指定端口,关键方法
accept()
用于接受客户端连接。 - Socket:客户端和服务器端进行数据传输的套接字,关键方法
getInputStream()
和getOutputStream()
分别用于获取输入输出流。 - InputStream:用于读取数据,关键方法
read()
用于从流中读取数据到字节数组。 - OutputStream:用于写入数据,关键方法
write()
用于将字节数组的数据写入流中。