• springboot项目添加TCP接口数据上传/下发


    一般在启动类上添加

    注意:一般检测TCP传输的数据软件----Sockit

    @SpringBootApplication
    
    public class Application extends SpringBootServletInitializer implements CommandLineRunner {
    
    	@Autowired      //注意此处将要用的TCP进行调用
    	TcpSocketServer tcpSocketServer;
    public static void main(String[] args)throws IOException { SpringApplication.run(Application.class, args); } @Override //重写run方法,来对TCP数据进行操作 public void run(String... args) throws Exception { tcpSocketServer.startSocketServer(port); //注:此处port绑定端口号 } }

     在 tcpSocketServer 内:   注意:一般涉及TCP接口的项目都是关于指令上传和下发的

    @Component
    @Slf4j      //前提是 导入了lombok的包
    public class TcpSocketServer extends BaseController {
    	@Autowired
    	TcpServices tcpServices;
    	@Autowired
    	XxxService xxxService;
    	
        private Charset cs = Charset.forName("UTF-8");
    	//接受数据缓冲区
    	private static ByteBuffer sBuffer = ByteBuffer.allocate(1024);
    	//发送数据缓冲区
    	private static ByteBuffer rBuffer = ByteBuffer.allocate(1024);
    	//监听器
    	private static Selector selector;
    
    	private static String	responseMsg;
    	/**
    	 * 启动socket服务,开启监听
    	 *
    	 * @param port
    	 * @throws IOException
    	 */
    	public  void startSocketServer(int port) {
    		try {
    			//打开通信信道
    			ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    			//设置为非阻塞
    			serverSocketChannel.configureBlocking(false);
    			//获取套接字
    			ServerSocket serverSocket = serverSocketChannel.socket();
    			//绑定端口号
    			serverSocket.bind(new InetSocketAddress(port));
    			//打开监听器
    			selector = Selector.open();
    			//将通信信道注册到监听器
    			serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    
    			//监听器会一直监听,如果客户端有请求就会进入相应的事件处理
    			while (true) {
    				selector.select();//select方法会一直阻塞直到有相关事件发生或超时
    				Set<SelectionKey> selectionKeys = selector.selectedKeys();//监听到的事件
    				for (SelectionKey key : selectionKeys) {
    					handle(key);
    				}
    				selectionKeys.clear();//清除处理过的事件
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 处理不同的事件
    	 *
    	 * @param selectionKey
    	 * @throws IOException
    	 */
    	private void handle(SelectionKey selectionKey) throws IOException {
    		ServerSocketChannel serverSocketChannel = null;
    		SocketChannel socketChannel = null;
    		String requestMsg = "";
    		int count = 0;
    		if (selectionKey.isAcceptable()) {
    			//每有客户端连接,即注册通信信道为可读
    			serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
    			socketChannel = serverSocketChannel.accept();
    			socketChannel.configureBlocking(false);
    			socketChannel.register(selector, SelectionKey.OP_READ);
    		} else if (selectionKey.isReadable()) {
    			socketChannel = (SocketChannel) selectionKey.channel();
    			rBuffer.clear();
    			count = socketChannel.read(rBuffer);
    
    			//读取数据
    			if (count > 0){
    			rBuffer.flip(); //从缓存区头部开始读取数据操作
                   //缓存区读取到的数据
                    requestMsg = String.valueOf(cs.decode(rBuffer).array()); }
     //这里是处理从TCP接口上传的数据业务层,一般可以在业务层根据switch case来对不同数据进行分类方法处理
    xxxServices.dealMethods(requestMsg); 
    sBuffer = ByteBuffer.allocate(responseMsg.getBytes("UTF-8").length);

    //一般responseMsg为从数据库或其他数据源处获取的数据字符串
    //此处为指令下发
    responseMsg=configurationMap.toString();
    		sBuffer.put(responseMsg.getBytes("UTF-8"));			      									
    		sBuffer.flip();
    		socketChannel.write(sBuffer);				
    				}	
    		socketChannel.close();
    		  }
    		}
    	  }
    	}
    

      

     

    
    
  • 相关阅读:
    c语言 423输出直角在右上角的等腰直角三角形
    R语言中aggregate函数进行整合数据
    c语言 425输出向下的金字塔
    C语言 423 输出直角在左上角的等腰直角三角形
    c语言 422 显示出一个横向较长的长方形
    R语言中subset函数
    R语言中for、while、if else、switch语句
    c语言 424 输出金字塔性状
    R语言中apply函数
    WinCE文件基本操作
  • 原文地址:https://www.cnblogs.com/pureray-hui/p/13367035.html
Copyright © 2020-2023  润新知