Browse Source

Socket 구조 수정 작업

master
노승철 2 years ago
parent
commit
e287bc6f37
  1. 32
      src/main/java/com/palnet/comn/collection/GPCollection.java
  2. 42
      src/main/java/com/palnet/server/SocketServer.java
  3. 132
      src/main/java/com/palnet/server/command/SocketCommand.java
  4. 44
      src/main/java/com/palnet/server/handler/SocketHandler.java
  5. 6
      src/main/resources/application.yml

32
src/main/java/com/palnet/comn/collection/GPCollection.java

@ -2,15 +2,26 @@ package com.palnet.comn.collection;
import com.palnet.comn.utils.ContextUtils; import com.palnet.comn.utils.ContextUtils;
import com.palnet.comn.utils.DateUtils; import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.JsonUtils;
import com.palnet.process.message.producer.MessageProducer; import com.palnet.process.message.producer.MessageProducer;
import com.palnet.comn.model.GPDatabaseModel; import com.palnet.comn.model.GPDatabaseModel;
import com.palnet.comn.model.GPHistoryModel; import com.palnet.comn.model.GPHistoryModel;
import com.palnet.comn.model.GPModel; import com.palnet.comn.model.GPModel;
import io.netty.channel.AbstractChannel;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
/** /**
@ -51,12 +62,25 @@ public class GPCollection {
data.setPostionHistory(historyList); data.setPostionHistory(historyList);
/* Message Queue Server 전달 */ /* Message Queue Server 전달 */
// convertModel(data);
messageProducer.sendToAppServerMessage(data); messageProducer.sendToAppServerMessage(data);
try {
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress("192.168.0.24", 4355);
socket.connect(address);
String gpsJson = JsonUtils.toJson(data);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(gpsJson.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
} }
// public void convertModel(GPModel model) {
// messageProducer.sendToAppServerMessage(model);
// }
} }

42
src/main/java/com/palnet/server/SocketServer.java

@ -21,19 +21,13 @@ public class SocketServer {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Value("${netty.socket.port}") @Value("${netty.socket.port}")
private int port; private int socketPort;
@Value("${netty.socket.thread.boss}") @Value("${netty.websocket.port}")
private int threadBoss; private int websocketPort;
@Value("${netty.socket.thread.worker}") private EventLoopGroup bossGroup;
private int threadWorker; private EventLoopGroup workerGroup;
private Channel ch;
private EventLoopGroup bossGroup ;
private EventLoopGroup workerGroup ;
private ServerBootstrap b = new ServerBootstrap(); private ServerBootstrap b = new ServerBootstrap();
// @Autowired // @Autowired
@ -73,8 +67,6 @@ public class SocketServer {
.childHandler(new SocketInitializer()); .childHandler(new SocketInitializer());
connection(); connection();
// taskProcess();
// client.start();
logger.warn("====== [SOCKET SERVER] Start ====== "); logger.warn("====== [SOCKET SERVER] Start ====== ");
}catch (Exception e) { }catch (Exception e) {
@ -85,20 +77,16 @@ public class SocketServer {
} }
private void connection() { private void connection() {
//서버는 Listen상태로 기다려야하는데, 톰캣이 Timeout이 발생함 //서버는 Listen 상태로 기다려야하는데, 톰캣이 Timeout 발생함, 이를 방지하기 위해서 별도의 thread 로 처리한다.
//이를 방지하기 위해 Thread로 처리한다. new Thread(() -> {
new Thread(new Runnable() { try {
@Override ChannelFuture socketFuture = b.bind(socketPort).sync();
public void run() { socketFuture.channel().closeFuture().sync();
try {
ChannelFuture future = b.bind(port).sync(); } catch (InterruptedException e) {
future.channel().closeFuture().sync(); logger.error("InterruptedException", e);
}
} catch (InterruptedException e) { }).start();
logger.error("InterruptedException", e);
}
}
}).start();
} }

132
src/main/java/com/palnet/server/command/SocketCommand.java

@ -1,11 +1,25 @@
package com.palnet.server.command; package com.palnet.server.command;
import com.palnet.comn.collection.GPCollection; import com.palnet.comn.collection.GPCollection;
import com.palnet.comn.model.GPHistoryModel;
import com.palnet.comn.model.GPModel; import com.palnet.comn.model.GPModel;
import com.palnet.comn.utils.ContextUtils;
import com.palnet.comn.utils.DateUtils;
import com.palnet.comn.utils.JsonUtils;
import com.palnet.process.message.producer.MessageProducer;
import com.palnet.server.codec.SocketPayload; import com.palnet.server.codec.SocketPayload;
import com.palnet.server.collection.ChannelCollection;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -13,27 +27,28 @@ import java.util.List;
public class SocketCommand { public class SocketCommand {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
GPCollection collection = new GPCollection(); private MessageProducer messageProducer;
private Environment env;
public SocketCommand() {
this.messageProducer = (MessageProducer) ContextUtils.getBean("messageProducer");
this.env = env;
}
GPCollection collection = new GPCollection();
public void openSkyCollectionPut(SocketPayload payload) { public void openSkyCollectionPut(SocketPayload payload) {
/** Socket Body **/
List<LinkedHashMap<?,?>> resultList = (ArrayList)payload.getBody();
/** 전문 설정 ***/ /** 전문 설정 ***/
String messageType = "OPENSKY"; final String messageType = "OPENSKY";
String objectType = "FLIGHT"; final String objectType = "FLIGHT";
List<LinkedHashMap<?,?>> resultList = new ArrayList<LinkedHashMap<?,?>>();
List<GPModel> dataList = new ArrayList<GPModel>(); List<GPModel> dataList = new ArrayList<GPModel>();
logger.debug("BODY TYPE :: " + payload.getBody().getClass());
resultList = (ArrayList)payload.getBody();
GPModel model;
for(LinkedHashMap<?,?> obj : resultList) { for(LinkedHashMap<?,?> obj : resultList) {
model = new GPModel(); GPModel model = new GPModel();
model.setObjectType(objectType); model.setObjectType(objectType);
model.setMessageType(messageType); model.setMessageType(messageType);
@ -66,45 +81,38 @@ public class SocketCommand {
* @param payload * @param payload
*/ */
public void sandboxCollectionPut(SocketPayload payload) { public void sandboxCollectionPut(SocketPayload payload) {
List<LinkedHashMap<?,?>> resultList = (ArrayList)payload.getBody();
/** 전문 설정 ***/ /** 전문 설정 ***/
String messageType = "LTEM"; final String messageType = "LTEM";
String objectType = "DRON"; final String objectType = "DRON";
List<LinkedHashMap<?,?>> resultList = new ArrayList<LinkedHashMap<?,?>>();
List<GPModel> dataList = new ArrayList<GPModel>();
logger.debug("BODY TYPE :: " + payload.getBody().getClass());
resultList = (ArrayList)payload.getBody();
GPModel model; // List<GPModel> dataList = new ArrayList<GPModel>();
/** 데이터 모델링 **/
for(LinkedHashMap<?,?> obj : resultList) { for(LinkedHashMap<?,?> obj : resultList) {
//위,경도 좌표가 0으로 들어오는 것은 무시 처리 //위,경도 좌표가 0으로 들어오는 것은 무시 처리
if((Double)obj.get("lat") > 0 && (Double)obj.get("lon") > 0) { if((Double)obj.get("lat") > 0 && (Double)obj.get("lon") > 0) {
model = new GPModel(); GPModel model = new GPModel();
// logger.debug(">>>>" + obj.toString());
model.setObjectType(objectType); model.setObjectType(objectType);
model.setMessageType(messageType); model.setMessageType(messageType);
model.setObjectId(obj.get("objectId").toString().trim()); model.setObjectId(obj.get("objectId").toString().trim());
model.setTerminalId(payload.getTerminalId()); model.setTerminalId(payload.getTerminalId());
model.setTerminalRcvDt(obj.get("terminalRcvDt").toString().trim());
model.setSpeedType((String)obj.get("speedType"));
model.setElevType((String)obj.get("elevType"));
model.setMoveDistanceType((String)obj.get("moveDistanceType"));
model.setDronStatus((String)obj.get("dronStatus"));
if(obj.get("lat") != null) model.setLat(Double.valueOf(obj.get("lat").toString())); if(obj.get("lat") != null) model.setLat(Double.valueOf(obj.get("lat").toString()));
if(obj.get("lon") != null) model.setLng(Double.valueOf(obj.get("lon").toString())); if(obj.get("lon") != null) model.setLng(Double.valueOf(obj.get("lon").toString()));
if(obj.get("elev") != null) model.setElev(Double.valueOf(obj.get("elev").toString())); if(obj.get("elev") != null) model.setElev(Double.valueOf(obj.get("elev").toString()));
model.setTerminalRcvDt(obj.get("terminalRcvDt").toString().trim());
if(obj.get("speed") != null) model.setSpeed(Double.valueOf(obj.get("speed").toString())); if(obj.get("speed") != null) model.setSpeed(Double.valueOf(obj.get("speed").toString()));
if(obj.get("heading") != null) model.setHeading(Double.valueOf(obj.get("heading").toString())); if(obj.get("heading") != null) model.setHeading(Double.valueOf(obj.get("heading").toString()));
model.setSpeedType((String)obj.get("speedType"));
model.setElevType((String)obj.get("elevType"));
model.setMoveDistanceType((String)obj.get("moveDistanceType"));
if(obj.get("moveDistance") != null) model.setMoveDistance(Double.valueOf(obj.get("moveDistance").toString())); if(obj.get("moveDistance") != null) model.setMoveDistance(Double.valueOf(obj.get("moveDistance").toString()));
if(obj.get("betteryLevel") != null) model.setBetteryLevel(Double.valueOf(obj.get("betteryLevel").toString())); if(obj.get("betteryLevel") != null) model.setBetteryLevel(Double.valueOf(obj.get("betteryLevel").toString()));
if(obj.get("betteryVoltage") != null) model.setBetteryVoltage(Double.valueOf(obj.get("betteryVoltage").toString())); if(obj.get("betteryVoltage") != null) model.setBetteryVoltage(Double.valueOf(obj.get("betteryVoltage").toString()));
model.setDronStatus((String)obj.get("dronStatus"));
// 환경 데이터 필드 추가 // 환경 데이터 필드 추가
if(obj.get("sensorCo") != null) model.setSensorCo(Double.valueOf(obj.get("sensorCo").toString())); if(obj.get("sensorCo") != null) model.setSensorCo(Double.valueOf(obj.get("sensorCo").toString()));
@ -113,13 +121,59 @@ public class SocketCommand {
if(obj.get("sensorO3") != null) model.setSensorO3(Double.valueOf(obj.get("sensorO3").toString())); if(obj.get("sensorO3") != null) model.setSensorO3(Double.valueOf(obj.get("sensorO3").toString()));
if(obj.get("sensorDust") != null) model.setSensorDust(Double.valueOf(obj.get("sensorDust").toString())); if(obj.get("sensorDust") != null) model.setSensorDust(Double.valueOf(obj.get("sensorDust").toString()));
dataList.add(model); // 서버 수신 시간 정보
}else { model.setServerRcvDt(DateUtils.getCurrentTime());
logger.info("lat , lon No data ");
// 관제 이력 정보
List<GPHistoryModel> hisList;
GPHistoryModel history = new GPHistoryModel();
history.setObjectId(model.getObjectId());
history.setLat(model.getLat());
history.setLng(model.getLng());
if(model.getPostionHistory() != null) {
hisList = model.getPostionHistory();
} else {
hisList = new ArrayList<>();
}
hisList.add(history);
model.setPostionHistory(hisList);
// STEP 1. Control ID 발급 -> Application Server Http 통신
// STEP 2. 이력 생성할 전문 전달
messageProducer.sendToAppServerMessage(model);
// STEP 3. 화면에 표출할 정보 WebSocket 전달
try {
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress(
env.getProperty("netty.websocket.host"),
Integer.parseInt(env.getProperty("netty.websocket.port"))
);
socket.connect(address);
String gpsJson = JsonUtils.toJson(model);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(gpsJson.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
socket.close();
} catch (IOException e) {
logger.error("");
}
// dataList.add(model);
} else {
logger.error("좌표 정보가 존재하지 않습니다.");
throw new IllegalArgumentException("좌표 정보가 존재하지 않습니다.");
} }
} }
collection.putData(dataList); // collection.putData(dataList);
} }
} }

44
src/main/java/com/palnet/server/handler/SocketHandler.java

@ -5,6 +5,8 @@ import com.palnet.comn.utils.JsonUtils;
import com.palnet.server.codec.SocketPayload; import com.palnet.server.codec.SocketPayload;
import com.palnet.server.codec.SocketPayloadResponse; import com.palnet.server.codec.SocketPayloadResponse;
import com.palnet.server.command.SocketCommand; import com.palnet.server.command.SocketCommand;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -33,27 +35,25 @@ public class SocketHandler extends SimpleChannelInboundHandler<SocketPayload> {
protected void channelRead0(ChannelHandlerContext ctx, SocketPayload payload){ protected void channelRead0(ChannelHandlerContext ctx, SocketPayload payload){
try { try {
logger.debug("==================== [SocketHandler channelRead0 ] ==================== "); logger.debug("==================== [SocketHandler channelRead0 ] ==================== ");
logger.debug("AUTH KEY :: ==== > " +payload.getAuthKey()); logger.debug("AUTH KEY ===> {}", payload.getAuthKey());
// logger.info(auth.checkAuthkey(payload.getAuthKey().toString().trim()));
if(payload.getAuthKey().isEmpty()) {
logger.info("====== auth key is empty ======");
if(StringUtils.isEmpty(payload.getAuthKey())) {
// 인증키가 없을 경우
logger.debug("AUTH : no key " );
res.setRspCode("-2000"); res.setRspCode("-2000");
res.setRspMessage("inValidate AuthKey"); res.setRspMessage("auth key is empty !");
}else if(!auth.checkAuthkey(payload.getAuthKey().toString().trim())) {
// 인증키가 틀린 경우 } else if(!auth.checkAuthkey(payload.getAuthKey().trim())) {
logger.debug("AUTH : error key " ); logger.info("===== auth key is invalid =====");
logger.debug(payload.getAuthKey() );
// logger.info(auth.checkAuthkey(payload.getAuthKey().toString().trim()));
res.setRspCode("-2000"); res.setRspCode("-2000");
res.setRspMessage("inValidate AuthKey"); res.setRspMessage("Invalid auth key !");
}else{
logger.warn("MSG :: ==== > " + JsonUtils.toJson(payload)); } else {
logger.info("====> Socket Payload : {}", JsonUtils.toJson(payload));
switch(payload.getCommand().trim()) { switch (payload.getCommand().trim()) {
case "OPENSKY" : case "OPENSKY" :
command.openSkyCollectionPut(payload); command.openSkyCollectionPut(payload);
break; break;
@ -66,16 +66,14 @@ public class SocketHandler extends SimpleChannelInboundHandler<SocketPayload> {
res.setRspCode("0"); res.setRspCode("0");
res.setRspMessage("SUCCESS"); res.setRspMessage("SUCCESS");
} }
} catch(Exception e) {
}catch(Exception e) {
res.setRspCode("-9999"); res.setRspCode("-9999");
res.setRspMessage("Etc error"); res.setRspMessage("Etc error");
e.printStackTrace(); e.printStackTrace();
}finally { } finally {
logger.debug("res >>>" + JsonUtils.toJson(res)); logger.debug("res >>>" + JsonUtils.toJson(res));
ctx.writeAndFlush(res); ctx.writeAndFlush(res);
} }
@ -83,8 +81,7 @@ public class SocketHandler extends SimpleChannelInboundHandler<SocketPayload> {
} }
@Override
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.info("=========== [exceptionCaught ] ===================="); logger.info("=========== [exceptionCaught ] ====================");
res.setRspCode("-9999"); res.setRspCode("-9999");
@ -94,7 +91,4 @@ public class SocketHandler extends SimpleChannelInboundHandler<SocketPayload> {
cause.printStackTrace(); cause.printStackTrace();
ctx.close(); ctx.close();
} }
} }

6
src/main/resources/application.yml

@ -17,6 +17,9 @@ netty:
thread: thread:
boss: 1 boss: 1
worker: 1 worker: 1
websocket:
host: 127.0.0.1
port: 8081
server: server:
port: 8182 port: 8182
@ -85,6 +88,9 @@ netty:
thread: thread:
boss: 1 boss: 1
worker: 1 worker: 1
websocket:
host: pav.palntour.com
port: 8081
server: server:
port: 8182 port: 8182

Loading…
Cancel
Save