From cf7a184964902b44d35d7e9a4cf4dcaf4bd836db Mon Sep 17 00:00:00 2001 From: lastnumber Date: Thu, 8 Nov 2018 11:27:40 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/aitank/server/component/ObjectMultiAction.java | 2 +- src/main/java/com/aitank/server/protocol/PlayInfoData.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/aitank/server/component/ObjectMultiAction.java b/src/main/java/com/aitank/server/component/ObjectMultiAction.java index ab61dab..2bd6046 100644 --- a/src/main/java/com/aitank/server/component/ObjectMultiAction.java +++ b/src/main/java/com/aitank/server/component/ObjectMultiAction.java @@ -80,7 +80,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); } 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; } From 55f4482dcd5bd559692cc0f32183c7e43aaa9430 Mon Sep 17 00:00:00 2001 From: lastnumber Date: Wed, 21 Nov 2018 13:30:14 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8C=85=20jar?= =?UTF-8?q?=20=E5=8C=85=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 32 +++++++++++- .../aitank/server/dao/ApplicationTest.java | 14 ------ .../com/aitank/server/dao/UserDaoTest.java | 50 ------------------- 3 files changed, 31 insertions(+), 65 deletions(-) delete mode 100644 src/test/java/com/aitank/server/dao/ApplicationTest.java delete mode 100644 src/test/java/com/aitank/server/dao/UserDaoTest.java 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/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 From 1c4602cfaf22e8d2a5cc1b2e6b4fa3cc37ddf48f Mon Sep 17 00:00:00 2001 From: lastnumber Date: Wed, 28 Nov 2018 10:13:12 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/aitank/server/enums/EventType2.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/aitank/server/enums/EventType2.java b/src/main/java/com/aitank/server/enums/EventType2.java index a36cbbe..c4c505a 100644 --- a/src/main/java/com/aitank/server/enums/EventType2.java +++ b/src/main/java/com/aitank/server/enums/EventType2.java @@ -8,7 +8,8 @@ public enum EventType2 { MsgLogin("MsgLogin", 1), MsgInitPlay("MsgInitPlay", 2), MsgPlayInfoData("MsgPlayInfoData", 3), - MsgOnLogout("MsgOnLogout", 4); + MsgOnLogout("MsgOnLogout", 4), + MsgRoom("MsgRoom", 5); private String name ; From 11e3eb4083cb12affd25ab128adeea46dc8d94f4 Mon Sep 17 00:00:00 2001 From: lastnumber Date: Wed, 28 Nov 2018 18:04:29 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/component/ObjectMultiAction.java | 168 ++++++++++++++++-- .../com/aitank/server/enums/EventType2.java | 5 +- .../com/aitank/server/handler/TcpHandler.java | 20 ++- .../com/aitank/server/protocol/RoomData.java | 32 ++++ .../aitank/server/protocol/RoomDataList.java | 8 + .../aitank/server/protocol/SocketModel.java | 6 + 6 files changed, 223 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/aitank/server/protocol/RoomData.java create mode 100644 src/main/java/com/aitank/server/protocol/RoomDataList.java diff --git a/src/main/java/com/aitank/server/component/ObjectMultiAction.java b/src/main/java/com/aitank/server/component/ObjectMultiAction.java index 2bd6046..674a5df 100644 --- a/src/main/java/com/aitank/server/component/ObjectMultiAction.java +++ b/src/main/java/com/aitank/server/component/ObjectMultiAction.java @@ -3,18 +3,31 @@ 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 com.sun.xml.internal.ws.binding.FeatureListUtil; +import com.sun.xml.internal.ws.policy.PolicyMapUtil; import io.netty.channel.ChannelHandlerContext; +import org.slf4j.helpers.Util; import org.springframework.stereotype.Component; +import sun.plugin.com.Utils; + +import javax.naming.CannotProceedException; +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 +55,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()) { @@ -92,4 +118,122 @@ 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.joinRoom(userId); + + 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); + } + + /** + * 加入房间 + */ + 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.joinRoom(userId); + + 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; + + System.out.println("Exit Room: " + userId); + + RoomData room = msg.deserialize(RoomData.class); + room = rooms.get(room.getId()); + room.exitRoom(userId); + + 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()); + SocketModel response = new SocketModel(); + RoomDataList roomList = new RoomDataList(); + roomList.list.addAll(rooms); + + 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 c4c505a..a6049e9 100644 --- a/src/main/java/com/aitank/server/enums/EventType2.java +++ b/src/main/java/com/aitank/server/enums/EventType2.java @@ -9,7 +9,10 @@ public enum EventType2 { MsgInitPlay("MsgInitPlay", 2), MsgPlayInfoData("MsgPlayInfoData", 3), MsgOnLogout("MsgOnLogout", 4), - MsgRoom("MsgRoom", 5); + MsgCreateRoom("MsgCreateRoom", 5), + MsgJoinRoom("MsgJosinRoom", 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..8aabd4d 100644 --- a/src/main/java/com/aitank/server/handler/TcpHandler.java +++ b/src/main/java/com/aitank/server/handler/TcpHandler.java @@ -5,6 +5,7 @@ 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; @@ -26,6 +27,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 +78,34 @@ 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)) { + TcpHandler.rooms.remove(userId); + TcpHandler.players.remove(userId); System.out.println("PlayerNumbers : " + TcpHandler.players.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/RoomData.java b/src/main/java/com/aitank/server/protocol/RoomData.java new file mode 100644 index 0000000..972ab39 --- /dev/null +++ b/src/main/java/com/aitank/server/protocol/RoomData.java @@ -0,0 +1,32 @@ +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 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 List getPlayers() { return players; } + public void setPlayers(List value) { players = value; } + + public void joinRoom(String userId) { + players.add(userId); + } + + public void exitRoom(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..9439b05 --- /dev/null +++ b/src/main/java/com/aitank/server/protocol/RoomDataList.java @@ -0,0 +1,8 @@ +package com.aitank.server.protocol; + +import java.util.ArrayList; +import java.util.List; + +public class RoomDataList { + public List list = new ArrayList<>(); +} diff --git a/src/main/java/com/aitank/server/protocol/SocketModel.java b/src/main/java/com/aitank/server/protocol/SocketModel.java index 43bfd2d..75be5fb 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; @@ -123,6 +124,11 @@ public String getProtocolName() { public void setProtocolName(String protocolName) { ProtocolName = protocolName; } + + public void setProtocolName(EventType2 protocolType) { + ProtocolName = protocolType.getName(); + } + public String getProtocolDesc() { return ProtocolDesc; } From 8addc815b05917ae84d7df6c1cd9cbd6be23196f Mon Sep 17 00:00:00 2001 From: lastnumber Date: Fri, 30 Nov 2018 12:42:23 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E7=9B=B8=E5=85=B3api=20=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E7=9B=B8=E5=85=B3api=20=E6=9A=82=E6=97=B6=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E7=8E=A9=E5=AE=B6=E5=87=86=E5=A4=87=E5=92=8C=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E6=B8=B8=E6=88=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/component/ObjectMultiAction.java | 53 ++++++++++++------- .../com/aitank/server/enums/EventType2.java | 2 +- .../com/aitank/server/handler/TcpHandler.java | 12 +++-- .../com/aitank/server/protocol/RoomData.java | 8 ++- .../aitank/server/protocol/RoomDataList.java | 4 ++ .../aitank/server/protocol/SocketModel.java | 3 +- .../aitank/server/protocol/UserLoginData.java | 7 ++- .../utils/ChannelHandlerContextInfo.java | 6 +++ 8 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/aitank/server/component/ObjectMultiAction.java b/src/main/java/com/aitank/server/component/ObjectMultiAction.java index 674a5df..7da5596 100644 --- a/src/main/java/com/aitank/server/component/ObjectMultiAction.java +++ b/src/main/java/com/aitank/server/component/ObjectMultiAction.java @@ -1,18 +1,12 @@ 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.*; import com.aitank.utils.ChannelHandlerContextInfo; -import com.sun.xml.internal.ws.binding.FeatureListUtil; -import com.sun.xml.internal.ws.policy.PolicyMapUtil; import io.netty.channel.ChannelHandlerContext; -import org.slf4j.helpers.Util; import org.springframework.stereotype.Component; -import sun.plugin.com.Utils; -import javax.naming.CannotProceedException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -128,7 +122,10 @@ public void MsgCreateRoom(ChannelHandlerContext ctx, SocketModel msg) { room.setId(UUID.randomUUID().toString()); room.setMasterId(userId); - room.joinRoom(userId); + room.join(userId); + + // 设置用户所在房间 id + TcpHandler.players.get(userId).setRoomId(room.getId()); System.out.println("Create Room: " + userId + "->" + room.getName()); /* @@ -144,6 +141,12 @@ public void MsgCreateRoom(ChannelHandlerContext ctx, SocketModel msg) { 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); } /** @@ -157,12 +160,13 @@ public void MsgJoinRoom(ChannelHandlerContext ctx, SocketModel msg) { RoomData room = msg.deserialize(RoomData.class); room = rooms.get(room.getId()); - room.joinRoom(userId); + 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); + notificationPlayers(ctx.channel().id().toString(), room.getPlayers(), response); } /** @@ -171,17 +175,27 @@ public void MsgJoinRoom(ChannelHandlerContext ctx, SocketModel msg) { public void MsgExitRoom(ChannelHandlerContext ctx, SocketModel msg) { String userId = ctx.channel().id().toString(); Map rooms = TcpHandler.rooms; + ChannelHandlerContextInfo userInfo = TcpHandler.players.get(userId); - System.out.println("Exit Room: " + userId); + RoomData room = rooms.get(userInfo.getRoomId()); + room.exit(userId); + userInfo.setRoomId(null); - RoomData room = msg.deserialize(RoomData.class); - room = rooms.get(room.getId()); - room.exitRoom(userId); + 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); + notificationPlayers(ctx.channel().id().toString(), room.getPlayers(), response); } /** @@ -190,10 +204,9 @@ public void MsgExitRoom(ChannelHandlerContext ctx, SocketModel msg) { public void MsgRoomList(ChannelHandlerContext ctx, SocketModel msg) { Map roomMap = TcpHandler.rooms; List rooms = new ArrayList<>(roomMap.values()); - SocketModel response = new SocketModel(); - RoomDataList roomList = new RoomDataList(); - roomList.list.addAll(rooms); + RoomDataList roomList = new RoomDataList(rooms); + SocketModel response = new SocketModel(); response.setProtocolName(EventType2.MsgRoomList); response.serialize(roomList); ctx.writeAndFlush(response); @@ -204,7 +217,7 @@ public void MsgRoomList(ChannelHandlerContext ctx, SocketModel msg) { * @param currentPlayer * @param msg */ - private void NotificationPlayers(String currentPlayer, SocketModel 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); @@ -216,7 +229,7 @@ private void NotificationPlayers(String currentPlayer, SocketModel msg) { * 通知所有玩家 * @param msg */ - private void NotificationPlayers(SocketModel msg) { + private void notificationPlayers(SocketModel msg) { for (String cid : TcpHandler.players.keySet()) { ChannelHandlerContextInfo player = TcpHandler.players.get(cid); player.getChx().writeAndFlush(msg); @@ -229,7 +242,7 @@ private void NotificationPlayers(SocketModel msg) { * @param userIds * @param msg */ - private void NotificationPlayers(String currentPlayer, List userIds, SocketModel 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); diff --git a/src/main/java/com/aitank/server/enums/EventType2.java b/src/main/java/com/aitank/server/enums/EventType2.java index a6049e9..2fb8f2e 100644 --- a/src/main/java/com/aitank/server/enums/EventType2.java +++ b/src/main/java/com/aitank/server/enums/EventType2.java @@ -10,7 +10,7 @@ public enum EventType2 { MsgPlayInfoData("MsgPlayInfoData", 3), MsgOnLogout("MsgOnLogout", 4), MsgCreateRoom("MsgCreateRoom", 5), - MsgJoinRoom("MsgJosinRoom", 6), + MsgJoinRoom("MsgJoinRoom", 6), MsgRoomList("MsgRoomList", 7), MsgExitRoom("MsgExitRoom", 8); diff --git a/src/main/java/com/aitank/server/handler/TcpHandler.java b/src/main/java/com/aitank/server/handler/TcpHandler.java index 8aabd4d..8feaeca 100644 --- a/src/main/java/com/aitank/server/handler/TcpHandler.java +++ b/src/main/java/com/aitank/server/handler/TcpHandler.java @@ -2,7 +2,6 @@ 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; @@ -15,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; @@ -85,9 +82,16 @@ public void channelInactive(ChannelHandlerContext ctx) throws Exception { String userId = ctx.channel().id().toString(); if (TcpHandler.players.containsKey(userId)) { - TcpHandler.rooms.remove(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"); diff --git a/src/main/java/com/aitank/server/protocol/RoomData.java b/src/main/java/com/aitank/server/protocol/RoomData.java index 972ab39..dbad540 100644 --- a/src/main/java/com/aitank/server/protocol/RoomData.java +++ b/src/main/java/com/aitank/server/protocol/RoomData.java @@ -7,6 +7,7 @@ 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; } @@ -18,14 +19,17 @@ public class RoomData { 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 joinRoom(String userId) { + public void join(String userId) { players.add(userId); } - public void exitRoom(String 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 index 9439b05..0156344 100644 --- a/src/main/java/com/aitank/server/protocol/RoomDataList.java +++ b/src/main/java/com/aitank/server/protocol/RoomDataList.java @@ -5,4 +5,8 @@ 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 75be5fb..634779a 100644 --- a/src/main/java/com/aitank/server/protocol/SocketModel.java +++ b/src/main/java/com/aitank/server/protocol/SocketModel.java @@ -101,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; 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; }