diff --git a/pom.xml b/pom.xml
index 1d38028..0069e27 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
jar
ai-tank
For Ai Tank Server
-
+
4.1.27.Final
2.7
@@ -173,6 +173,36 @@
1.8
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+ lib/
+ com.aitank.ApplicationEntrance
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ compile
+
+ copy-dependencies
+
+
+ ${project.build.directory}/lib
+ false
+
+
+
+
diff --git a/src/main/java/com/aitank/server/component/ObjectMultiAction.java b/src/main/java/com/aitank/server/component/ObjectMultiAction.java
index ab61dab..7da5596 100644
--- a/src/main/java/com/aitank/server/component/ObjectMultiAction.java
+++ b/src/main/java/com/aitank/server/component/ObjectMultiAction.java
@@ -1,20 +1,27 @@
package com.aitank.server.component;
-import com.aitank.server.context.SpringContext;
import com.aitank.server.enums.EventType2;
import com.aitank.server.handler.TcpHandler;
-import com.aitank.server.protocol.PlayInfoData;
-import com.aitank.server.protocol.PlayInfoDataList;
-import com.aitank.server.protocol.SocketModel;
-import com.aitank.server.protocol.UserLoginData;
+import com.aitank.server.protocol.*;
import com.aitank.utils.ChannelHandlerContextInfo;
import io.netty.channel.ChannelHandlerContext;
import org.springframework.stereotype.Component;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
@Component
public class ObjectMultiAction {
- public void MsgLogin(ChannelHandlerContext ctx, SocketModel message){
+ /**
+ * 用户登录
+ *
+ * @param ctx
+ * @param message
+ */
+ public void MsgLogin(ChannelHandlerContext ctx, SocketModel message) {
UserLoginData UserLoginData = message.deserialize(UserLoginData.class);
//获取数值
@@ -42,27 +49,40 @@ public void MsgLogin(ChannelHandlerContext ctx, SocketModel message){
response.serialize(UserLoginData);
ctx.writeAndFlush(response);
}
- public void MsgPlayInfoData(ChannelHandlerContext ctx, SocketModel message){
+
+ /**
+ * 用户信息
+ *
+ * @param ctx
+ * @param message
+ */
+ public void MsgPlayInfoData(ChannelHandlerContext ctx, SocketModel message) {
PlayInfoData playInfoData = message.deserialize(PlayInfoData.class);
ChannelHandlerContextInfo currentPlayer = TcpHandler.players.get(ctx.channel().id().toString());
- currentPlayer.setPosition(new float[]{playInfoData.position1,playInfoData.position2,playInfoData.position3});
- currentPlayer.setRotation(new float[]{playInfoData.rotation1,playInfoData.rotation2,playInfoData.rotation3,playInfoData.rotation4});
+ currentPlayer.setPosition(new float[]{playInfoData.position1, playInfoData.position2, playInfoData.position3});
+ currentPlayer.setRotation(new float[]{playInfoData.rotation1, playInfoData.rotation2, playInfoData.rotation3, playInfoData.rotation4});
currentPlayer.setShoot(playInfoData.shoot);
currentPlayer.serverHealth = playInfoData.serverHealth;
SocketModel response = new SocketModel();
response.setProtocolName(EventType2.MsgPlayInfoData.getName());//("MsgPlayInfoData");
response.serialize(playInfoData);
- for (String cid : TcpHandler.players.keySet())
- {
- if(cid.equals(ctx.channel().id().toString()))
+ for (String cid : TcpHandler.players.keySet()) {
+ if (cid.equals(ctx.channel().id().toString()))
continue;
ChannelHandlerContextInfo player = TcpHandler.players.get(cid);
player.getChx().writeAndFlush(response);
}
}
- public void MsgInitPlay(ChannelHandlerContext ctx, SocketModel message){
+
+ /**
+ * 角色信息
+ *
+ * @param ctx
+ * @param message
+ */
+ public void MsgInitPlay(ChannelHandlerContext ctx, SocketModel message) {
PlayInfoDataList playInfoDataList = new PlayInfoDataList();
for (String cid : TcpHandler.players.keySet()) {
@@ -80,7 +100,7 @@ public void MsgInitPlay(ChannelHandlerContext ctx, SocketModel message){
playInfoData.serverHealth = player.serverHealth;
playInfoData.userId = player.getChx().channel().id().toString();
playInfoData.playName = player.getName();
- playInfoData.playNumber = playInfoDataList.playInfoDataList.size();
+ playInfoData.playerNumber = playInfoDataList.playInfoDataList.size();
playInfoDataList.playInfoDataList.add(playInfoData);
}
@@ -92,4 +112,141 @@ public void MsgInitPlay(ChannelHandlerContext ctx, SocketModel message){
ctx.writeAndFlush(response);
}
+
+ /**
+ * 创建信息
+ */
+ public void MsgCreateRoom(ChannelHandlerContext ctx, SocketModel msg) {
+ RoomData room = msg.deserialize(RoomData.class);
+ String userId = ctx.channel().id().toString();
+
+ room.setId(UUID.randomUUID().toString());
+ room.setMasterId(userId);
+ room.join(userId);
+
+ // 设置用户所在房间 id
+ TcpHandler.players.get(userId).setRoomId(room.getId());
+
+ System.out.println("Create Room: " + userId + "->" + room.getName());
+ /*
+ * 维护房间 Map
+ */
+ TcpHandler.rooms.put(room.getId(), room);
+ System.out.println("Room Number: " + TcpHandler.rooms.size());
+
+ /*
+ * 通知创建用户结果
+ */
+ SocketModel response = new SocketModel();
+ response.setProtocolName(EventType2.MsgCreateRoom);
+ response.serialize(room);
+ ctx.writeAndFlush(response);
+
+ RoomDataList roomList = new RoomDataList(new ArrayList<>(TcpHandler.rooms.values()));
+ SocketModel notifyRoomListRefresh = new SocketModel();
+ notifyRoomListRefresh.setProtocolName(EventType2.MsgRoomList);
+ notifyRoomListRefresh.serialize(roomList);
+ notificationPlayers(userId, notifyRoomListRefresh);
+ }
+
+ /**
+ * 加入房间
+ */
+ public void MsgJoinRoom(ChannelHandlerContext ctx, SocketModel msg) {
+ String userId = ctx.channel().id().toString();
+ Map rooms = TcpHandler.rooms;
+
+ System.out.println("Join Room: " + userId);
+
+ RoomData room = msg.deserialize(RoomData.class);
+ room = rooms.get(room.getId());
+ room.join(userId);
+ TcpHandler.players.get(userId).setRoomId(room.getId());
+
+ SocketModel response = new SocketModel();
+ response.setProtocolName(EventType2.MsgJoinRoom);
+ response.serialize(room);
+ notificationPlayers(ctx.channel().id().toString(), room.getPlayers(), response);
+ }
+
+ /**
+ * 离开房间
+ */
+ public void MsgExitRoom(ChannelHandlerContext ctx, SocketModel msg) {
+ String userId = ctx.channel().id().toString();
+ Map rooms = TcpHandler.rooms;
+ ChannelHandlerContextInfo userInfo = TcpHandler.players.get(userId);
+
+ RoomData room = rooms.get(userInfo.getRoomId());
+ room.exit(userId);
+ userInfo.setRoomId(null);
+
+ System.out.println("Exit Room: " + userId);
+ if (room.getPlayers().size() == 0) {
+ rooms.remove(room.getId());
+ RoomDataList roomList = new RoomDataList(new ArrayList<>(rooms.values()));
+ SocketModel notifyRoomListRefresh = new SocketModel();
+ notifyRoomListRefresh.setProtocolName(EventType2.MsgRoomList);
+ notifyRoomListRefresh.serialize(roomList);
+ notificationPlayers(userId, notifyRoomListRefresh);
+ System.out.println("===" + room.getName() + " Room Close ===");
+ }
+
+ SocketModel response = new SocketModel();
+ response.setProtocolName(EventType2.MsgExitRoom);
+ response.serialize(room);
+ notificationPlayers(ctx.channel().id().toString(), room.getPlayers(), response);
+ }
+
+ /**
+ * 发送房间列表
+ */
+ public void MsgRoomList(ChannelHandlerContext ctx, SocketModel msg) {
+ Map roomMap = TcpHandler.rooms;
+ List rooms = new ArrayList<>(roomMap.values());
+ RoomDataList roomList = new RoomDataList(rooms);
+
+ SocketModel response = new SocketModel();
+ response.setProtocolName(EventType2.MsgRoomList);
+ response.serialize(roomList);
+ ctx.writeAndFlush(response);
+ }
+
+ /**
+ * 通知所有玩家(排除当前会话玩家)
+ * @param currentPlayer
+ * @param msg
+ */
+ private void notificationPlayers(String currentPlayer, SocketModel msg) {
+ for (String cid : TcpHandler.players.keySet()) {
+ if (cid.equals(currentPlayer)) continue;
+ ChannelHandlerContextInfo player = TcpHandler.players.get(cid);
+ player.getChx().writeAndFlush(msg);
+ }
+ }
+
+ /**
+ * 通知所有玩家
+ * @param msg
+ */
+ private void notificationPlayers(SocketModel msg) {
+ for (String cid : TcpHandler.players.keySet()) {
+ ChannelHandlerContextInfo player = TcpHandler.players.get(cid);
+ player.getChx().writeAndFlush(msg);
+ }
+ }
+
+ /**
+ * 通知所有房间玩家
+ * @param currentPlayer
+ * @param userIds
+ * @param msg
+ */
+ private void notificationPlayers(String currentPlayer, List userIds, SocketModel msg) {
+ for (String cid : userIds) {
+ if (cid.equals(currentPlayer)) continue;
+ ChannelHandlerContextInfo player = TcpHandler.players.get(cid);
+ player.getChx().writeAndFlush(msg);
+ }
+ }
}
diff --git a/src/main/java/com/aitank/server/enums/EventType2.java b/src/main/java/com/aitank/server/enums/EventType2.java
index a36cbbe..2fb8f2e 100644
--- a/src/main/java/com/aitank/server/enums/EventType2.java
+++ b/src/main/java/com/aitank/server/enums/EventType2.java
@@ -8,7 +8,11 @@ public enum EventType2 {
MsgLogin("MsgLogin", 1),
MsgInitPlay("MsgInitPlay", 2),
MsgPlayInfoData("MsgPlayInfoData", 3),
- MsgOnLogout("MsgOnLogout", 4);
+ MsgOnLogout("MsgOnLogout", 4),
+ MsgCreateRoom("MsgCreateRoom", 5),
+ MsgJoinRoom("MsgJoinRoom", 6),
+ MsgRoomList("MsgRoomList", 7),
+ MsgExitRoom("MsgExitRoom", 8);
private String name ;
diff --git a/src/main/java/com/aitank/server/handler/TcpHandler.java b/src/main/java/com/aitank/server/handler/TcpHandler.java
index 7294292..8feaeca 100644
--- a/src/main/java/com/aitank/server/handler/TcpHandler.java
+++ b/src/main/java/com/aitank/server/handler/TcpHandler.java
@@ -2,9 +2,9 @@
import com.aitank.server.component.ObjectMultiAction;
import com.aitank.server.context.SpringContext;
-import com.aitank.server.dao.UserDao;
import com.aitank.server.enums.EventType2;
import com.aitank.server.protocol.PlayInfoData;
+import com.aitank.server.protocol.RoomData;
import com.aitank.server.protocol.SocketModel;
import com.aitank.utils.ChannelHandlerContextInfo;
import io.netty.channel.Channel;
@@ -14,8 +14,6 @@
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
-import org.apache.ibatis.executor.statement.BaseStatementHandler;
-import org.springframework.beans.factory.annotation.Autowired;
import java.lang.reflect.Method;
import java.util.HashMap;
@@ -26,6 +24,7 @@ public class TcpHandler extends ChannelInboundHandlerAdapter {
public static Map players = new HashMap();
+ public static Map rooms = new HashMap<>();
public static final ChannelGroup group = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
public Map handlerMap = new HashMap<>();
@@ -76,22 +75,41 @@ public void channelActive(ChannelHandlerContext ctx) throws Exception {
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+ System.out.println("room:" + ctx.channel().id() + " leave room");
System.out.println("clinet:" + ctx.channel().id() + " leave server");
super.channelInactive(ctx);
- if (TcpHandler.players.containsKey(ctx.channel().id().toString())) {
- TcpHandler.players.remove(ctx.channel().id().toString());
+ String userId = ctx.channel().id().toString();
+
+ if (TcpHandler.players.containsKey(userId)) {
+ String roomId = TcpHandler.players.get(userId).getRoomId();
+ if (TcpHandler.rooms.containsKey(roomId)) {
+ RoomData room = TcpHandler.rooms.get(roomId);
+ room.exit(userId);
+ if (room.getPlayers().size() == 0)
+ TcpHandler.rooms.remove(roomId);
+ }
+ TcpHandler.players.remove(userId);
System.out.println("PlayerNumbers : " + TcpHandler.players.size());
+ System.out.println("RoomNumbers : " + TcpHandler.rooms.size());
SocketModel response = new SocketModel();
response.setProtocolName(EventType2.MsgOnLogout.getName());//("MsgOnLogout");
PlayInfoData playInfoData = new PlayInfoData();
- playInfoData.userId = ctx.channel().id().toString();
+ playInfoData.userId = userId;
response.serialize(playInfoData);
+ /*
+ * 退出房间
+ */
+ SocketModel room = new SocketModel();
+ room.setProtocolName(EventType2.MsgExitRoom);
+ room.serialize(userId);
+
for (String cid : TcpHandler.players.keySet()) {
ChannelHandlerContextInfo player = TcpHandler.players.get(cid);
+ player.getChx().writeAndFlush(room);
player.getChx().writeAndFlush(response);
}
diff --git a/src/main/java/com/aitank/server/protocol/PlayInfoData.java b/src/main/java/com/aitank/server/protocol/PlayInfoData.java
index 8761924..3cdc3bf 100644
--- a/src/main/java/com/aitank/server/protocol/PlayInfoData.java
+++ b/src/main/java/com/aitank/server/protocol/PlayInfoData.java
@@ -15,5 +15,5 @@ public class PlayInfoData {
public float force = 15f;
public int serverHealth=1 ;
public String playName="";
- public int playNumber;
+ public int playerNumber;
}
diff --git a/src/main/java/com/aitank/server/protocol/RoomData.java b/src/main/java/com/aitank/server/protocol/RoomData.java
new file mode 100644
index 0000000..dbad540
--- /dev/null
+++ b/src/main/java/com/aitank/server/protocol/RoomData.java
@@ -0,0 +1,36 @@
+package com.aitank.server.protocol;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RoomData {
+ private String id;
+ private String Name;
+ private String masterId;
+ private String masterName;
+ private List players = new ArrayList<>();
+
+ public String getId() { return id; }
+ public void setId(String value) { id = value; }
+
+ public String getName() { return Name; }
+ public void setName(String value) { Name = value; }
+
+ public String getMasterId() { return masterId; }
+ public void setMasterId(String value) { masterId = value; }
+
+ public String getMasterName() { return masterName; }
+ public void setMasterName(String value) { masterName = value; }
+
+ public List getPlayers() { return players; }
+ public void setPlayers(List value) { players = value; }
+
+ public void join(String userId) {
+ players.add(userId);
+ }
+
+ public void exit(String userId) {
+ players.remove(userId);
+ }
+}
+
diff --git a/src/main/java/com/aitank/server/protocol/RoomDataList.java b/src/main/java/com/aitank/server/protocol/RoomDataList.java
new file mode 100644
index 0000000..0156344
--- /dev/null
+++ b/src/main/java/com/aitank/server/protocol/RoomDataList.java
@@ -0,0 +1,12 @@
+package com.aitank.server.protocol;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RoomDataList {
+ public List list = new ArrayList<>();
+
+ public RoomDataList(List list) {
+ this.list = list;
+ }
+}
diff --git a/src/main/java/com/aitank/server/protocol/SocketModel.java b/src/main/java/com/aitank/server/protocol/SocketModel.java
index 43bfd2d..634779a 100644
--- a/src/main/java/com/aitank/server/protocol/SocketModel.java
+++ b/src/main/java/com/aitank/server/protocol/SocketModel.java
@@ -1,5 +1,6 @@
package com.aitank.server.protocol;
+import com.aitank.server.enums.EventType2;
import io.protostuff.LinkedBuffer;
import io.protostuff.ProtobufIOUtil;
import io.protostuff.ProtostuffIOUtil;
@@ -100,7 +101,8 @@ public T deserialize(Class targetClass) {
byte[] paramArrayOfByte = bytes;
if (paramArrayOfByte == null || paramArrayOfByte.length == 0) {
- throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
+// throw new RuntimeException("反序列化对象发生异常,byte序列为空!");
+ return null;
}
T instance = null;
@@ -123,6 +125,11 @@ public String getProtocolName() {
public void setProtocolName(String protocolName) {
ProtocolName = protocolName;
}
+
+ public void setProtocolName(EventType2 protocolType) {
+ ProtocolName = protocolType.getName();
+ }
+
public String getProtocolDesc() {
return ProtocolDesc;
}
diff --git a/src/main/java/com/aitank/server/protocol/UserLoginData.java b/src/main/java/com/aitank/server/protocol/UserLoginData.java
index d12b47e..182fb03 100644
--- a/src/main/java/com/aitank/server/protocol/UserLoginData.java
+++ b/src/main/java/com/aitank/server/protocol/UserLoginData.java
@@ -5,8 +5,9 @@ public class UserLoginData {
private String UserId;
private String UserName;
private String PassWord;
-
- public String getUserName() {
+ private String roomId;
+
+ public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
@@ -24,4 +25,6 @@ public String getUserId() {
public void setUserId(String userId) {
UserId = userId;
}
+ public String getRoomId() { return roomId; }
+ public void setRoomId(String value) { roomId = value; }
}
diff --git a/src/main/java/com/aitank/utils/ChannelHandlerContextInfo.java b/src/main/java/com/aitank/utils/ChannelHandlerContextInfo.java
index 71636ee..070498d 100644
--- a/src/main/java/com/aitank/utils/ChannelHandlerContextInfo.java
+++ b/src/main/java/com/aitank/utils/ChannelHandlerContextInfo.java
@@ -5,6 +5,12 @@
public class ChannelHandlerContextInfo {
private float force;
+ private String roomId;
+
+ public String getRoomId() { return roomId; }
+
+ public void setRoomId(String value) { roomId = value; }
+
public boolean isShoot() {
return shoot;
}
diff --git a/src/test/java/com/aitank/server/dao/ApplicationTest.java b/src/test/java/com/aitank/server/dao/ApplicationTest.java
deleted file mode 100644
index 96c2e47..0000000
--- a/src/test/java/com/aitank/server/dao/ApplicationTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.aitank.server.dao;
-
-
-import org.junit.runner.RunWith;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.transaction.annotation.Transactional;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("classpath:/spring/applicationContext.xml")
-@Transactional(rollbackFor=Exception.class)
-public class ApplicationTest {
-
-}
diff --git a/src/test/java/com/aitank/server/dao/UserDaoTest.java b/src/test/java/com/aitank/server/dao/UserDaoTest.java
deleted file mode 100644
index f5ce6e7..0000000
--- a/src/test/java/com/aitank/server/dao/UserDaoTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.aitank.server.dao;
-
-import com.aitank.server.pojo.User;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.annotation.Rollback;
-import java.util.List;
-
-public class UserDaoTest extends ApplicationTest{
-
- @Autowired
- private UserDao userDao;
- @Test
- public void selectAllUser() {
- List plist= userDao.selectAllUser();
- System.out.println(plist.size());
- for(User user : plist){
- System.out.println(user);
- }
- }
-
- @Test
- public void selectUserById() {
- String uuid = "123";
- User user = userDao.selectUserById(uuid);
- System.out.println(user);
- }
-
- @Test
- public void selectUserByName() {
- String username = "tom";
- User user= userDao.selectUserByName(username);
- System.out.println(user);
- }
-
- @Test
- @Rollback(false)
- public void deleteUser() {
- String uuid = "123";
- Integer flag = userDao.deleteUser(uuid);
- if(flag == 0 ){
- System.out.println("got it ");
- }else if(flag <0){
- System.out.println("error it");
- }else {
- System.err.println("what the fuck are you doing ? ");
- }
- System.err.println(flag);
- }
-}
\ No newline at end of file