aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/pokemon
diff options
context:
space:
mode:
authorcirakg <ciraboxkg@gmail.com>2022-12-29 02:27:32 +0100
committercirakg <ciraboxkg@gmail.com>2022-12-29 02:27:32 +0100
commit336af3217840237bba99935d63631d199d5c0e3e (patch)
treef56a52afe92bf587aa892a29037bde0c0e8b9041 /src/main/java/pokemon
parent7354be4e170ac684af8f4289191fd1ea01764cfe (diff)
Omogucena konekcija pomocu socketa. Omogucen login i primanje poruka. Handlovanje gasenje clienta(Logout). Napravljen kostur klase Game. Popravljen text wrap na warningu pri login-u.
Diffstat (limited to 'src/main/java/pokemon')
-rw-r--r--src/main/java/pokemon/Game.java113
-rw-r--r--src/main/java/pokemon/Server.java169
2 files changed, 275 insertions, 7 deletions
diff --git a/src/main/java/pokemon/Game.java b/src/main/java/pokemon/Game.java
new file mode 100644
index 0000000..fa08a1b
--- /dev/null
+++ b/src/main/java/pokemon/Game.java
@@ -0,0 +1,113 @@
+package pokemon;
+
+
+import java.io.Serializable;
+import java.nio.channels.SocketChannel;
+import java.util.ArrayList;
+
+import models.MonsterViewModel;
+
+public class Game implements Runnable, Serializable {
+
+ boolean player1Turn;
+ long player1Id;
+ long player2Id;
+ MonsterViewModel monster1;
+ MonsterViewModel monster2;
+ int currentHp1;
+ int currentHp2;
+ int shield1;
+ int shield2;
+ SocketChannel []players;
+
+ public Game() {
+ super();
+ }
+
+ @Override
+ public void run() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public long getPlayer1Id() {
+ return player1Id;
+ }
+
+
+ public void setPlayer1Id(long player1Id) {
+ this.player1Id = player1Id;
+ }
+
+
+ public long getPlayer2Id() {
+ return player2Id;
+ }
+
+
+ public void setPlayer2Id(long player2Id) {
+ this.player2Id = player2Id;
+ }
+
+
+ public MonsterViewModel getMonster1() {
+ return monster1;
+ }
+
+
+ public void setMonster1(MonsterViewModel monster1) {
+ this.monster1 = monster1;
+ }
+
+
+ public MonsterViewModel getMonster2() {
+ return monster2;
+ }
+
+
+ public void setMonster2(MonsterViewModel monster2) {
+ this.monster2 = monster2;
+ }
+
+
+ public int getCurrentHp1() {
+ return currentHp1;
+ }
+
+
+ public void setCurrentHp1(int currentHp1) {
+ this.currentHp1 = currentHp1;
+ }
+
+
+ public int getCurrentHp2() {
+ return currentHp2;
+ }
+
+
+ public void setCurrentHp2(int currentHp2) {
+ this.currentHp2 = currentHp2;
+ }
+
+
+ public int getShield1() {
+ return shield1;
+ }
+
+
+ public void setShield1(int shield1) {
+ this.shield1 = shield1;
+ }
+
+
+ public int getShield2() {
+ return shield2;
+ }
+
+
+ public void setShield2(int shield2) {
+ this.shield2 = shield2;
+ }
+
+
+}
diff --git a/src/main/java/pokemon/Server.java b/src/main/java/pokemon/Server.java
index 52e9e77..a3296af 100644
--- a/src/main/java/pokemon/Server.java
+++ b/src/main/java/pokemon/Server.java
@@ -1,18 +1,34 @@
package pokemon;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
import java.rmi.Naming;
-import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
import models.CONSTS;
+import models.User;
public class Server implements Runnable {
+ private ServerSocketChannel serverSocketChannel;
+ private Selector selector;
+ private ArrayList<Game> games;
+ HashMap<SocketChannel,Long > players = new HashMap<SocketChannel,Long>();
+ IService s;
+ ByteBuffer bb = ByteBuffer.allocate(1024);
public static void main(String[] args) {
Server server=new Server();
new Thread(server).start();
}
public Server() {
- IService s;
try {
s = new Service();
System.out.println("created registry at "+CONSTS.port);
@@ -23,21 +39,160 @@ public class Server implements Runnable {
e.printStackTrace();
}
+
+ try {
+ serverSocketChannel=ServerSocketChannel.open();
+
+ serverSocketChannel.socket().bind(new InetSocketAddress(CONSTS.socketPort));
+ serverSocketChannel.configureBlocking(false);
+ selector=Selector.open();
+ serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+
}
@Override
public void run() {
try {
- while(true) {
- Thread.sleep(500);
- System.out.println("serverTest");
+ Iterator<SelectionKey> iter;
+ SelectionKey key;
+
+ while(this.serverSocketChannel.isOpen())
+ {
+ selector.select();
+ iter = selector.selectedKeys().iterator();
+
+ while(iter.hasNext())
+ {
+ key = iter.next();
+ iter.remove();
+
+ if(key.isAcceptable())
+ acceptConnection(key);
+
+ if(key.isReadable())
+ readMessage(key);
+
+ }
}
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
+ } catch (Exception e) {
e.printStackTrace();
}
}
+ private void readMessage(SelectionKey key)throws Exception {
+ SocketChannel sc = (SocketChannel) key.channel();
+ StringBuilder sb = new StringBuilder();
+ int read=0;
+ while( (read=sc.read(bb)) > 0 )
+ {
+ bb.flip();
+ byte[] bytes = new byte[bb.limit()];
+ bb.get(bytes);
+ sb.append(new String(bytes));
+ bb.clear();
+ }
+ if(read==-1)
+ {
+ Long closedId=players.get(sc);
+ players.remove(sc);
+ System.out.println("Client dissconnected: "+closedId );
+ System.out.println("Remaining clients: "+players.size() );
+ sc.close();
+ return;
+ }
+ System.out.println(sb.toString());
+ String[] msg=sb.toString().trim().split(":");
+ if(msg[0].equals("LOGIN")) {
+ User newUser=new User();
+ newUser.setUsername(msg[1].trim());
+ newUser.setPassword(msg[2].trim());
+ String message;
+ User res=s.login(newUser);
+ if(res == null)
+ {
+ message="BADLOGIN";
+ ByteBuffer buff = ByteBuffer.wrap(message.getBytes());
+ sc.write(buff);
+ }
+ else {
+ message="ACCEPTED"+":"+res.id;
+ players.put(sc,res.id);
+ ByteBuffer buff = ByteBuffer.wrap(message.getBytes());
+ sc.write(buff);
+
+ }
+
+ }
+
+
+ }
+ private void acceptConnection(SelectionKey key) throws Exception {
+ SocketChannel sc = ((ServerSocketChannel) key.channel()).accept();
+
+ String address = (new StringBuilder( sc.socket().getInetAddress().toString() )).append(":").append( sc.socket().getPort() ).toString();
+ sc.configureBlocking(false);
+
+ System.out.println("adress "+address);
+
+ bb.clear();
+ int read = 0;
+ StringBuilder sb = new StringBuilder();
+
+ sc.configureBlocking(true);
+
+ while( (read = sc.read(bb)) > 0 )
+ {
+ bb.flip();
+ byte[] bytes = new byte[bb.limit()];
+ bb.get(bytes);
+ sb.append(new String(bytes));
+ bb.clear();
+ sc.configureBlocking(false);
+ }
+
+ String message = sb.toString();
+
+ System.out.println("message: " + message);
+
+ String []words = message.split(":");
+ System.out.println(words[0]);
+ if(words[0].trim().equals("LOGIN") == false)
+ {
+ System.out.println("Not Login : ");
+ return;
+ }
+ User newUser=new User();
+ newUser.setUsername(words[1].trim());
+ newUser.setPassword(words[2].trim());
+
+ User res=s.login(newUser);
+ if(res == null)
+ {
+ message="BADLOGIN";
+ ByteBuffer buff = ByteBuffer.wrap(message.getBytes());
+ sc.write(buff);
+ sc.register(selector, SelectionKey.OP_READ, address);
+ }
+ else {
+ message="ACCEPTED"+":"+res.id;
+ players.put(sc,res.id);
+ ByteBuffer buff = ByteBuffer.wrap(message.getBytes());
+ sc.write(buff);
+
+ sc.register(selector, SelectionKey.OP_READ, address);
+
+ }
+
+
+
+
+
+ }
}