2个springboot项目,通过socket连接以后,如何互相访问controller方法,给一个案例
时间: 2024-03-05 15:50:46 浏览: 104
Java开发案例-springboot-12-集成socket.io服务端和客户端-源代码+文档.rar
好的,下面给一个简单的案例。
假设我们有两个Spring Boot项目,分别是A项目和B项目。现在我们要实现A项目调用B项目中的UserController的getUserInfo方法。
首先,在B项目中定义一个UserController,如下:
```java
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{userId}")
public User getUserInfo(@PathVariable String userId) {
// 根据userId查询用户信息
User user = new User();
user.setUserId(userId);
user.setUserName("张三");
user.setAge(20);
return user;
}
}
```
这个Controller的作用是根据userId查询用户信息。
接下来,在A项目中定义一个类,用于向B项目发送请求并获取响应。我们可以使用Java自带的Socket类来实现。
```java
public class SocketClient {
public static void main(String[] args) throws IOException {
// 连接B项目的Socket服务器
Socket socket = new Socket("127.0.0.1", 8888);
// 发送请求
String request = "{\"action\": \"getUserInfo\", \"params\": {\"userId\": \"123\"}}";
OutputStream outputStream = socket.getOutputStream();
outputStream.write(request.getBytes());
outputStream.flush();
// 接收响应
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String response = baos.toString();
System.out.println(response);
// 关闭资源
baos.close();
inputStream.close();
outputStream.close();
socket.close();
}
}
```
这个类的作用是向B项目发送一个请求,请求B项目中的UserController的getUserInfo方法,并将响应打印出来。
最后,在B项目中定义一个类,用于监听A项目的请求并调用UserController的相应方法。
```java
public class SocketServer {
public static void main(String[] args) throws IOException {
// 启动Socket服务器
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
// 监听客户端的连接
Socket socket = serverSocket.accept();
// 处理请求
new Thread(() -> {
try {
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String request = baos.toString();
// 解析请求
JSONObject jsonObject = JSONObject.parseObject(request);
String action = jsonObject.getString("action");
JSONObject params = jsonObject.getJSONObject("params");
// 调用UserController的方法
if ("getUserInfo".equals(action)) {
String userId = params.getString("userId");
UserController userController = new UserController();
User user = userController.getUserInfo(userId);
// 封装响应
String response = JSON.toJSONString(user);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(response.getBytes());
outputStream.flush();
// 关闭资源
outputStream.close();
}
baos.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
```
这个类的作用是启动一个Socket服务器,监听A项目的请求,并根据请求调用UserController的相应方法,并将处理结果封装成响应发送给A项目。
这样,当我们运行SocketClient类时,就可以从B项目中的UserController获取到用户信息,并将信息打印出来。
阅读全文