面试题答案
一键面试服务器端基本步骤
- 创建ServerSocket对象:指定服务器监听的端口号,例如
ServerSocket serverSocket = new ServerSocket(12345);
。 - 等待客户端连接:调用
serverSocket.accept()
方法,该方法会阻塞直到有客户端连接到服务器,返回一个Socket
对象,代表与客户端的连接,例如Socket clientSocket = serverSocket.accept();
。 - 处理数据传输:通过
clientSocket
获取输入输出流,如InputStream inputStream = clientSocket.getInputStream();
和OutputStream outputStream = clientSocket.getOutputStream();
,之后可以通过流进行数据的读取和写入。 - 关闭连接:数据传输完成后,关闭相关流和
Socket
对象,例如inputStream.close(); outputStream.close(); clientSocket.close();
,最后关闭ServerSocket
,serverSocket.close();
客户端基本步骤
- 创建Socket对象:指定服务器的IP地址和端口号,例如
Socket socket = new Socket("127.0.0.1", 12345);
。 - 处理数据传输:同服务器端一样,通过
socket
获取输入输出流InputStream inputStream = socket.getInputStream();
和OutputStream outputStream = socket.getOutputStream();
,然后进行数据的读写操作。 - 关闭连接:数据传输完成后,关闭相关流和
Socket
对象,inputStream.close(); outputStream.close(); socket.close();
连接建立处理
- 服务器端:
ServerSocket.accept()
方法负责等待并接受客户端的连接请求,建立连接后返回Socket
对象。 - 客户端:
new Socket()
构造函数负责尝试连接到服务器指定的IP和端口,成功则建立连接返回Socket
对象。
数据传输处理
- 输入:通过
InputStream
的read()
等方法从流中读取数据,例如byte[] buffer = new byte[1024]; int length = inputStream.read(buffer);
。 - 输出:通过
OutputStream
的write()
方法向流中写入数据,例如outputStream.write(buffer, 0, length);
。
关闭连接处理
- 无论是客户端还是服务器端,在数据传输完成后,都要关闭
Socket
及相关的输入输出流,以释放资源。关闭顺序一般是先关闭流,再关闭Socket
。关闭操作可以放在finally
块中,以确保即使在数据传输过程中出现异常,也能正确关闭连接和流。