面试题答案
一键面试基于Socket进行网络通信的基本流程
- 服务器端:
- 创建ServerSocket对象,绑定指定端口。
- 调用
accept()
方法监听客户端连接,该方法会阻塞直到有客户端连接上来。 - 与客户端建立连接后,通过
Socket
对象获取输入流和输出流,进行数据的读写操作。 - 操作完成后,关闭相关资源(如输入流、输出流、Socket等)。
- 客户端:
- 创建
Socket
对象,指定服务器的IP地址和端口号,尝试连接服务器。 - 连接成功后,通过
Socket
对象获取输入流和输出流,进行数据的读写操作。 - 操作完成后,关闭相关资源(如输入流、输出流、Socket等)。
- 创建
代码示例
- 服务器端代码(Server.java):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("服务器已启动,等待客户端连接...");
try (Socket socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
System.out.println("客户端已连接");
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("收到客户端消息: " + inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 客户端代码(Client.java):
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
out.write("Hello, Server!\n");
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,服务器端在端口12345监听客户端连接,客户端连接到本地主机(localhost
)的12345端口,并向服务器发送一条消息“Hello, Server!”,服务器接收并打印该消息。注意在实际运行时,需先启动服务器端程序,再启动客户端程序。