java服务端如何作为客户端实现websocket?
上一篇文章中,写了如何使用java来实现服务端的websocket,但有时候服务端也会作为client客户端来去请求前端,这个时候服务端就是一个clent客户端,前端则成了服务端。那么这时候的websocket代码明显是不一样的,因为虽然同样是java后台,但却是一个作为服务端、一个作为客户端。那么今天就来接着上篇java端作为服务端实现websocket后,再实现一个java端作为客户端来实现websocket,代码实现流程如下:
引入Maven jar包
<!--websocket作为客户端-->
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.2</version>
</dependency>
我们需要创建一个Java WebSocketClient 的类
@Slf4j
@Component
public class JavaClient {
* 获取客户端连接实例
* @param uri
* @return
public static WebSocketClient getClient(String userId, String uri) {
try {
//创建客户端连接对象
WebSocketClient client = new WebSocketClient(new URI(uri), new Draft_6455()) {
* 建立连接调用
* @param serverHandshake
@Override
public void onOpen(ServerHandshake serverHandshake) {
log.info("-------------与大模型建立连接-------------");
* 收到服务端消息调用
* @param s
@Override
public void onMessage(String s) {
log.info("收到来自服务端的消息:" + s);
//4、收到服务端消息
WebSocketHandler.sendOneMessage(userId, s);
* 断开连接调用
* @param i
* @param s
* @param b
@Override
public void onClose(int i, String s, boolean b) {
log.info("关闭连接:::" + "i = " + i + ":::s = " + s + ":::b = " + b);
* 连接报错调用
* @param e
@Override
public void onError(Exception e) {
log.error("报错了:::" + e.getMessage());
* 请求与服务端建立连接
client.connect();
//判断连接状态,0为请求中 1为已建立 其它值都是建立失败
while (client.getReadyState().ordinal() == WebSocket.READ_OPEN.getCode()) {
try {
Thread.sleep(200);
} catch (Exception e) {
log.warn("延迟操作出现问题,但并不影响功能");
log.info("-------------大模型连接中-------------");
//连接状态不再是0请求中,判断建立结果是不是1已建立
if (client.getReadyState().ordinal() == WebSocket.CONNECT.getCode()) {
log.info("---------大模型连接成功----------");
return client;
} catch (URISyntaxException e) {
log.error(e.getMessage());
return null;
相关的代码已经实现了,我们可以再写一个测试类,来调用该类。通过参数传入来调前端。
WebSocketClient client = JavaClient.getClient(userId, serverIP);
if (client != null) {
JSONObject object = new JSONObject();
object.put("", message);
String[][] strings = {{"aaa"}};
object.put("history", strings);
object.put("knowledge_base_id", "/home/nemo/aigc/langchain-ChatGLM/vector_store/knowledge_FAISS_20230516_133609");
//3、发送问题
client.send(object.toString());
userId:用户ID;
serverIP:调用的IP;
message:传入的参数;
history:前后端协商的参数;
knowlede_base_id:也是前后端相关的协商的参数;
Android AppcompateImageView 详解 android:orderincategory
一、 使用xml定义Menu菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用 标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是和。
标签没有任何属性,但可以嵌套在标签中,表示子菜单的形式。不过标签中不能再嵌入标签。 1.标签的属性含义如下:Id:表示菜单项的资源IDmenuCategory:同种菜单项的种类。该属性可取4个值:container、syste