阔口阔落丷 2023-06-07 10:56 采纳率: 0%
浏览 40

java接收socket消息多次连接后无法接收数据


@Slf4j
@Component
public class SocketServer {

    public void start() throws IOException {
        ExecutorService newCacheThreadPool = new ThreadPoolExecutor(
                10,
                100,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(1000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        Integer prot = Integer.parseInt(AppConfigUtil.getProperty("aaa.org.socket.prot"));


        ServerSocket server = new ServerSocket(prot);
        log.info("socket服务端启动....端口:{}", prot);
        while (true) {
            final Socket socket = server.accept();
            log.info("开始处理请求");
            newCacheThreadPool.execute(() -> {
                try {
                    handler(socket);
                } catch (Exception e) {
                    log.error("socket异常");
                    e.printStackTrace();
                }
            });
        }
    }

    private void handler(Socket socket) throws Exception {
        MDC.put(RequestListener.LOG_ID, UuidUtil.millisIdStr());
        //输入流接收数据
        InputStream inputStream = socket.getInputStream();
        //输出流发送数据
        OutputStream outputStream = socket.getOutputStream();
        try {
            while (true) {
                byte[] buf = new byte[10240];
                int len = inputStream.read(buf);
                StringBuilder sb = new StringBuilder();
                if ( len > 0) {
                    // 注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
                    sb.append(new String(buf, 0, len, StandardCharsets.UTF_8));
                    log.info("hl7消息数据:{}",sb.toString());
                    if (sb != null) {
                        String result = sb.toString().replaceAll("\n", "\r")
                                .replaceAll("\u000B", "").replaceAll("amp;", "").replaceAll("\u001c", "").replaceAll("\ufffd", "");
                        new HL7Convert().hl7Text2Obj(result, inputStream, outputStream);
                    }
                }else {
                    log.info("Socket没有数据");
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error("socket异常");
        } finally {
            log.info("socket关闭");
            try {
                inputStream.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
                log.error("关闭socket异常");
            }
        }
    }

}

使用该代码接收socket数据时,本地测试是没有问题的,但是部署到正式环境上就不行了,部署到正式环境上面可能是数据发送方发送的数据太多了或者连接的socket连接数太多了,导致后面再发送数据的时候,只会打印”开始处理请求“日志,而没有打印“hl7消息数据”日志,希望帮忙看下

  • 写回答

2条回答 默认 最新

  • 技术宅program 2023-06-07 11:35
    关注

    线程池大小不足。你的线程池大小是10-100,你弄大一点

    评论

报告相同问题?

问题事件

  • 修改了问题 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害