Browse Source

tcp服务器

master
lijunjie 3 years ago
parent
commit
989a18ef79
  1. 8
      pom.xml
  2. 7
      src/main/java/com/ccsens/pelma_analyse/PelmaAnalyseApplication.java
  3. 5
      src/main/java/com/ccsens/pelma_analyse/service/PelmaDataAccept.java
  4. 16
      src/main/java/com/ccsens/pelma_analyse/service/impl/PelmaDataAcceptImpl.java
  5. 8
      src/main/java/com/ccsens/pelma_analyse/service/impl/SerialServiceImpl.java
  6. 21
      src/main/java/com/ccsens/pelma_analyse/util/GetServiceUrlAnalyseUtil.java
  7. 22
      src/main/java/com/ccsens/pelma_analyse/util/netty/NettyStartListener.java
  8. 66
      src/main/java/com/ccsens/pelma_analyse/util/netty/SocketHandler.java
  9. 25
      src/main/java/com/ccsens/pelma_analyse/util/netty/SocketInitializer.java
  10. 58
      src/main/java/com/ccsens/pelma_analyse/util/netty/SocketServer.java
  11. 13
      src/main/resources/application.yml

8
pom.xml

@ -41,6 +41,14 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
</dependencies> </dependencies>

7
src/main/java/com/ccsens/pelma_analyse/PelmaAnalyseApplication.java

@ -5,9 +5,12 @@ import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication @SpringBootApplication
public class PelmaAnalyseApplication { @EnableAsync
public class PelmaAnalyseApplication{
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication springApplication=new SpringApplication(PelmaAnalyseApplication.class); SpringApplication springApplication=new SpringApplication(PelmaAnalyseApplication.class);
@ -15,9 +18,11 @@ public class PelmaAnalyseApplication {
springApplication.setBannerMode(Banner.Mode.OFF); springApplication.setBannerMode(Banner.Mode.OFF);
ConfigurableApplicationContext run = springApplication.run(args); ConfigurableApplicationContext run = springApplication.run(args);
//串口连接
SerialServiceImpl serialService = run.getBean(SerialServiceImpl.class); SerialServiceImpl serialService = run.getBean(SerialServiceImpl.class);
serialService.connect(); serialService.connect();
} }
} }

5
src/main/java/com/ccsens/pelma_analyse/service/PelmaDataAccept.java

@ -0,0 +1,5 @@
package com.ccsens.pelma_analyse.service;
public interface PelmaDataAccept {
public void handle(String data);
}

16
src/main/java/com/ccsens/pelma_analyse/service/impl/PelmaDataAcceptImpl.java

@ -0,0 +1,16 @@
package com.ccsens.pelma_analyse.service.impl;
import com.ccsens.pelma_analyse.service.PelmaDataAccept;
import com.ccsens.pelma_analyse.util.GetServiceUrlAnalyseUtil;
import org.springframework.web.client.RestTemplate;
public class PelmaDataAcceptImpl implements PelmaDataAccept {
@Override
public void handle(String accept_str) {
String pelma_url = GetServiceUrlAnalyseUtil.getUrl();
RestTemplate restTemplate = new RestTemplate();
String url = pelma_url + "/store?pelma=" + accept_str;
restTemplate.getForEntity(url, String.class);
}
}

8
src/main/java/com/ccsens/pelma_analyse/service/impl/SerialServiceImpl.java

@ -17,13 +17,13 @@ import java.util.List;
@Service @Service
public class SerialServiceImpl implements SerialService { public class SerialServiceImpl implements SerialService {
@Value("${com_num}") @Value("${serial.com_num}")
public int com_num; public int com_num;
@Value("${com_num_limit}") @Value("${serial.com_num_limit}")
public int com_num_limit; public int com_num_limit;
@Value("${pelma_url}") @Value("${service_url_analyse}")
public String pelma_url; public String pelma_url;
@Value("${white_list}") @Value("${serial.white_list}")
public ArrayList<String> white_list; public ArrayList<String> white_list;
public byte[] join_data; public byte[] join_data;

21
src/main/java/com/ccsens/pelma_analyse/util/GetServiceUrlAnalyseUtil.java

@ -0,0 +1,21 @@
package com.ccsens.pelma_analyse.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class GetServiceUrlAnalyseUtil {
private static String url;
public static String getUrl()
{
return url;
}
@Value("${service_url_analyse}")
public void setUrl(String service_url_analyse)
{
url = service_url_analyse;
}
}

22
src/main/java/com/ccsens/pelma_analyse/util/netty/NettyStartListener.java

@ -0,0 +1,22 @@
package com.ccsens.pelma_analyse.util.netty;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 监听Spring容器启动完成完成后启动Netty服务器
* @author Gjing
**/
@Component
public class NettyStartListener implements ApplicationRunner {
@Resource
private SocketServer socketServer;
@Override
public void run(ApplicationArguments args) throws Exception {
this.socketServer.start();
}
}

66
src/main/java/com/ccsens/pelma_analyse/util/netty/SocketHandler.java

@ -0,0 +1,66 @@
package com.ccsens.pelma_analyse.util.netty;
import com.ccsens.pelma_analyse.service.PelmaDataAccept;
import com.ccsens.pelma_analyse.service.impl.PelmaDataAcceptImpl;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* Socket拦截器用于处理客户端的行为
*
* @author Gjing
**/
@Slf4j
@Component
public class SocketHandler extends ChannelInboundHandlerAdapter {
public static final ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
/**
* 读取到客户端发来的消息
*
* @param ctx ChannelHandlerContext
* @param msg msg
* @throws Exception e
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 由于我们配置的是 字节数组 编解码器,所以这里取到的用户发来的数据是 byte数组
byte[] data = (byte[]) msg;
String accept_str = new String(data);
log.info("收到消息: " + accept_str);
PelmaDataAccept pelmaDataAccept = new PelmaDataAcceptImpl();
pelmaDataAccept.handle(accept_str);
// 给其他人转发消息
// for (Channel client : clients) {
// if (!client.equals(ctx.channel())) {
// client.writeAndFlush(data);
// }
// }
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
log.info("新的客户端链接:" + ctx.channel().id().asShortText());
clients.add(ctx.channel());
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
clients.remove(ctx.channel());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.channel().close();
clients.remove(ctx.channel());
}
}

25
src/main/java/com/ccsens/pelma_analyse/util/netty/SocketInitializer.java

@ -0,0 +1,25 @@
package com.ccsens.pelma_analyse.util.netty;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import org.springframework.stereotype.Component;
/**
* Socket 初始化器每一个Channel进来都会调用这里的 InitChannel 方法
* @author Gjing
**/
@Component
public class SocketInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
// 添加对byte数组的编解码,netty提供了很多编解码器,你们可以根据需要选择
pipeline.addLast(new ByteArrayDecoder());
pipeline.addLast(new ByteArrayEncoder());
// 添加上自己的处理器
pipeline.addLast(new SocketHandler());
}
}

58
src/main/java/com/ccsens/pelma_analyse/util/netty/SocketServer.java

@ -0,0 +1,58 @@
package com.ccsens.pelma_analyse.util.netty;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author Gjing
**/
@Slf4j
@Component
public class SocketServer {
@Resource
private SocketInitializer socketInitializer;
@Getter
private ServerBootstrap serverBootstrap;
/**
* netty服务监听端口
*/
@Value("${netty.port:8088}")
private int port;
/**
* 主线程组数量
*/
@Value("${netty.bossThread:1}")
private int bossThread;
/**
* 启动netty服务器
*/
public void start() {
this.init();
this.serverBootstrap.bind(this.port);
log.info("Netty started on port: {} (TCP) with boss thread {}", this.port, this.bossThread);
}
/**
* 初始化netty配置
*/
private void init() {
// 创建两个线程组,bossGroup为接收请求的线程组,一般1-2个就行
NioEventLoopGroup bossGroup = new NioEventLoopGroup(this.bossThread);
// 实际工作的线程组
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
this.serverBootstrap = new ServerBootstrap();
this.serverBootstrap.group(bossGroup, workerGroup) // 两个线程组加入进来
.channel(NioServerSocketChannel.class) // 配置为nio类型
.childHandler(this.socketInitializer); // 加入自己的初始化器
}
}

13
src/main/resources/application.yml

@ -4,8 +4,13 @@ spring:
server: server:
port: 8080 port: 8080
service_url_analyse: "http://127.0.0.1:8001"
netty:
port: 8011
bossThread: 1
#串口号 #串口号
com_num: 5 serial:
com_num_limit: 10 com_num: 1
pelma_url: "http://127.0.0.1:8001" com_num_limit: 10
white_list: 616162626364,616162626365,616162626366,616162626367,616162626368 white_list: 616162626364,616162626365,616162626366,616162626367,616162626368
Loading…
Cancel
Save