springboot中使用socket对接第三方接口

1、接口对接需求如下

1.1 socket协议
1.2 报文中数据均是左对齐右补空格
1.3 报文编码采用:GBK
1.4 接口文档:
在这里插入图片描述

2、代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.List;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;


public JSONObject testRequest(String userCode) throws IOException {
		logger.info("请求信息:{}",userCode);
		Socket socket = new Socket(ip, port);
		OutputStream os = socket.getOutputStream();
		byte[] param = byteMergerAll(
				fillParam("210", 3),//交易码
				fillParam(userCode, 10));//用户代码
		os.write(param);
		InputStream is = socket.getInputStream();
		byte[] result = new byte[1024];
		is.read(result);
		logger.info("响应信息:{},{}",new String(result, "GBK"));
		JSONObject resultJSON = new JSONObject();
		resultJSON.set("businessCode", new String(getByteByIndex(result, 0, 3)));//交易码
		resultJSON.set("code", new String(getByteByIndex(result, 4, 6)).trim());//响应码
		return resultJSON;
	}

3、涉及到的工具类

	/**
	 * 合并多个byte数组
	 *
	 * @param values
	 * @return
	 */
	private byte[] byteMergerAll(byte[]... values) {
		int length_byte = 0;
		for (int i = 0; i < values.length; i++) {
			length_byte += values[i].length;
		}
		byte[] all_byte = new byte[length_byte];
		int countLength = 0;
		for (int i = 0; i < values.length; i++) {
			byte[] b = values[i];
			System.arraycopy(b, 0, all_byte, countLength, b.length);
			countLength += b.length;
		}
		return all_byte;
	}

	/**
	 * 格式化参数
	 *
	 * @param str
	 * @param count
	 * @return
	 */
	private byte[] fillParam(String str, int count) throws UnsupportedEncodingException {
		if (str.getBytes("GBK").length >= count) {
			return str.getBytes("GBK");
		}
		byte[] data = str.getBytes("GBK");
		byte[] empty = new byte[count - data.length];
		for (int i = 0; i < empty.length; i++) {
			empty[i] = 32;
		}
		return byteMergerAll(empty, data);
	}
	
	/**
	 * 截取数组
	 *
	 * @param original
	 * @param begin
	 * @param end
	 * @return
	 */
	private byte[] getByteByIndex(byte[] original, int begin, int end) {
		byte[] result = new byte[end - begin + 1];
		int j = 0;
		for (int i = begin; i <= end; i++) {
			result[j] = original[i];
			j++;
		}
		return result;
	}

4、socket服务端本地测试工具

在这里插入图片描述
点击此处,下载socket工具

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,下面是一个使用 Kotlin 和 Spring Boot 写的简单的 Socket 服务器的例子: 首先,我们需要添加对 Spring Boot 和 Kotlin 的依赖,我们可以在 `build.gradle` 文件添加以下内容: ```groovy dependencies { implementation("org.springframework.boot:spring-boot-starter-websocket") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") } ``` 接下来,我们可以创建一个 `WebSocketController` 类,用来处理 WebSocket 的请求: ```kotlin import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.ResponseBody import org.springframework.web.socket.WebSocketHandler import org.springframework.web.socket.config.annotation.EnableWebSocket import org.springframework.web.socket.config.annotation.WebSocketConfigurer import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean @Controller @EnableWebSocket @RequestMapping("/socket") class WebSocketController : WebSocketConfigurer { override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) { registry.addHandler(SocketHandler(), "/socket-handler") } @GetMapping("/test") @ResponseBody fun test(): String { return "Hello World!" } // 设置 WebSocket 缓冲区的大小 fun servletServerContainerFactoryBean(): ServletServerContainerFactoryBean { val servletServerContainerFactoryBean = ServletServerContainerFactoryBean() servletServerContainerFactoryBean.maxBinaryMessageBufferSize = 1024 * 1024 servletServerContainerFactoryBean.maxTextMessageBufferSize = 1024 * 1024 return servletServerContainerFactoryBean } } class SocketHandler : WebSocketHandler { override fun afterConnectionEstablished(session: WebSocketSession) { println("Connection established!") } override fun handleMessage(session: WebSocketSession, message: WebSocketMessage<*>) { println("Received message: ${message.payload}") } override fun handleTransportError(session: WebSocketSession, exception: Throwable) { println("Transport Error!") } override fun afterConnectionClosed(session: WebSocketSession, closeStatus: CloseStatus) { println("Connection closed!") } override fun supportsPartialMessages(): Boolean { return false } } ``` 在上面的代码,`WebSocketController` 类实现了 `WebSocketConfigurer` 接口,用来注册 WebSocket 的处理程序。同时,我们还定义了一个 `SocketHandler` 类,用来处理 WebSocket 的消息。在 `WebSocketController` 类,我们还定义了一个测试用的 API,用来返回一个字符串。 最后,我们需要在 `application.properties` 文件配置 Tomcat 的 WebSocket 支持: ``` server.tomcat.max-connections=1000 server.tomcat.max-threads=200 server.tomcat.accept-count=200 server.tomcat.max-http-post-size=10000000 server.tomcat.max-swallow-size=10000000 ``` 在上面的配置,我们设置了 Tomcat 的最大连接数、最大线程数、最大 HTTP POST 大小等等。 以上就是一个简单的使用 Kotlin 和 Spring Boot 写的 Socket 服务器的例子,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值