首页 > 编程语言 >java socket通讯

java socket通讯

时间:2023-03-22 11:23:20浏览次数:41  
标签:info 通讯 java log new import socket

创建socket服务

package com.z.socket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Component
@Slf4j
public class ServerSocketConfig {
    public static ServerSocket serverSocket = null;

    private static final ThreadPoolExecutor threadpool = new ThreadPoolExecutor(15, 15,
            10L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

    @Bean
    public void socketCreate() {
        // 使用多线程创建,accept() 会阻塞程序执行(后面代码不能被执行)
        Runnable socketRun = new Thread() {
            @Override
            public void run() {
                log.info("创建socket线程");
                try {
                    serverSocket = new ServerSocket(514);
                    log.info("socket服务端开启");
                    while (true) {
                        Socket socket = serverSocket.accept();
                        log.info("接收到客户端socket" + socket.getRemoteSocketAddress());
                        threadpool.execute(new ServerReceiveThread(socket));
                    }
                } catch (IOException e) {
                    log.info("socket服务启动异常");
                    e.printStackTrace();
                }
            }
        };
        new Thread(socketRun).start();
    }
}

监听数据

package com.z.config.socket;

import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

@Slf4j
public class ServerReceiveThread implements Runnable {

    private Socket socket;

    public ServerReceiveThread(Socket socket) {
        this.socket = socket;
    }

    /**
     * 解析为十六进制数据
     */
    private String getCode(byte[] req) {
        String HEXES = "0123456789ABCDEF";
        final StringBuilder hex = new StringBuilder(2 * req.length);

        for (int i = 0; i < req.length; i++) {
            byte b = req[i];
            hex.append(HEXES.charAt((b & 0xF0) >> 4))
                    .append(HEXES.charAt((b & 0x0F))).append(" ");
        }
        return hex.toString();
    }

    @Override
    public void run() {
        try {
            // 接收客户端信息
            InputStream inputStream = socket.getInputStream();
            // 发送客户端信息
            OutputStream outputStream = socket.getOutputStream();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            DataOutputStream dout = new DataOutputStream(out);
            byte[] b = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(b)) != -1) {
                dout.write(b, 0, len);
            }
            String data = getCode(out.toByteArray());
            log.info("服务器收到消息:{}", data);
            log.info("服务器解析消息: {}", out.toString());
            String msg = "server response success";
            outputStream.write(msg.getBytes());
            # 关闭流
            dout.close();
            out.close();
            inputStream.close();
            outputStream.close();
            socket.close();
        } catch (Exception e) {
            log.info("接收数据异常socket关闭");
            e.printStackTrace();
        } finally {
            log.info("数据异常数据要怎么保留");
        }
    }
}

标签:info,通讯,java,log,new,import,socket
From: https://www.cnblogs.com/2393920029-qq/p/17243015.html

相关文章

  • java中使用对象储存OSS
    首先获取 ACCESS_KEYSECRET 与 ACCESS_KEYID 获取  ENDPOINT与ALI_DOMAIN 与 BUCKET_NAME(存储空间名称)代码importcom.aliyun.oss.OSS;importcom.aliy......
  • Java面试问题
    1、面向对象的特征有哪些方面?答:抽象、继承、封装、多态。1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对......
  • [ c ] 文件操作详解———通讯录
    本文主要介绍了C语言中有关文件的基础知识与基本操作,对涉及到的操作函数进行了详细解释,同时以笔者自己的理解,对函数的命名进行了一些探究,并以通讯录为例,做了打开存储等演示......
  • Java 资源加载库 Azzet
    Azzet是一个简单的Java类库,用于从不同的源中加载资源。示例代码:BufferedImageimg=Assets.load("http://www.google.com/logos/classicplus.png");//loadedfrom......
  • Java关键字-volatile详解
    点击  ​​Mr.绵羊的知识星球​​ 解锁更多优质文章。一、介绍1.简介  volatile是java关键字,同时也是JVM提供的轻量级的同步机制2.特性  你需要先了解一下Jav......
  • java通过短信发送验证码
    /**如uid是:test,登录密码是:123123pwd=md5(123123test),即pwd=b9887c5ebb23ebb294acab183ecf0769线生成地址:http://www.sms.cn/password*/......
  • java代码中获取classpath路径
    javaweb工程中,有时候需要自己手动的去读取classpath下面的配置文件,这里总结一点读取classpath路径的方法,分享一下。方法一:Stringpath=Test.class.getResource("/").......
  • JavaScript 浏览器打断点 Debugging
      1.下面我们看一个例子,这里是5+1=6,但是结果是51   console.log效率会比较低  2.debug可以暂停代码,和查看变量,按F12,看Sources  3.展开鼠标类型,......
  • Java Spring使用EventSource进行服务端推送
    Java代码:@ResponseBody@RequestMapping(value="/getDate",produces="text/event-stream;charset=UTF-8")publicvoidgetDate(HttpServletResponse......
  • Java中实现按字符串位数在前面补0
    场景现在要将4在前面补位为0004。实现1.首先将方法包装为工具类StringwaterCode=CommonUtils.fillZeroBeforeString(String.valueOf(max),4);其中max为最大值即4,第二个参......