Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions src/ncu/sw/TCPSM/TCPMultiServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@ public class TCPMultiServer implements Runnable{
protected ServerSocket welcomeSocket = null ;
private boolean isStopped = false;
private int serverPort;

private ArrayList<InetAddress> clientIPTable;

private ArrayList<InetSocketAddress> clientTable;
private InputStream input;
private OutputStream output;
private int idCnt = 0;

private static TCPMultiServer tcpServer = null ;
Expand All @@ -51,17 +47,12 @@ public static TCPMultiServer getInstance(){
}
return tcpServer;
}

public void run(){
while( !isStopped() ) {
Socket clientSocket = null;
/* Accept connection */
try {
clientSocket = this.welcomeSocket.accept();
/*System.out.println("Addr : "+ clientSocket.getInetAddress()
+ " Port : " + clientSocket.getPort() );*/

// UDPBroadCastClient.getInstance().startFirstReceive(5000);
System.out.print("IP is " +clientSocket.getInetAddress()+"\n");
UDPBroadCastClient.getInstance().startUDPBroadcast(5000);
clientIPTable.add( clientSocket.getInetAddress() );
Expand Down
49 changes: 41 additions & 8 deletions src/ncu/sw/TCPSM/WorkerThread.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@
*/

import ncu.sw.UDPSM.UDPBroadCastClient;
import ncu.sw.gameServer.BulletTask;
import ncu.sw.gameServer.ServerGameController;
import ncu.sw.gameUtility.Player;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Timer;

public class WorkerThread implements Runnable{
private Socket clientSocket = null;
Expand All @@ -34,38 +38,67 @@ public void run() {
}
}catch (IOException e){
removeWorkerFromClientTable();

System.out.println("one client has left...");
System.out.println(identity + " has left...");
}
}
public void removeWorkerFromClientTable() {
InetSocketAddress socketAddress = new InetSocketAddress(clientSocket.getInetAddress(),clientSocket.getPort());
TCPMultiServer.getInstance().getClientTable().remove(
new InetSocketAddress(clientSocket.getInetAddress(),clientSocket.getPort())
socketAddress
);
UDPBroadCastClient.getInstance().removeFromUDPTable(clientSocket.getInetAddress());
ServerGameController.getInstance().removePlayer(clientSocket.getInetAddress());
String checkID = ServerGameController.getInstance().removePlayer(socketAddress);
System.out.print("FUCKYOU " +checkID);
UDPBroadCastClient.getInstance().getUDPTable().remove(checkID);
System.out.println(checkID + "is left from UDP");

for (int i = 0;i<ServerGameController.getInstance().getCmd().getPlayerArrayList().size(); i ++) {
System.out.println("Id" + ServerGameController.getInstance().getCmd().getPlayerArrayList().get(i).getId());
}
}
public void stringParsing( String str ) { // TURN 5
String[] token = str.split(" ");
switch ( token[0] ){
case "TURN" :
//TCPMultiServer.fakeCDC.updateDirection(id,Integer.valueOf(token[1]));
ServerGameController.getInstance().playerMove(identity, Integer.parseInt(token[1]));
// System.out.println(identity + "move ");
break;
case "GET" :
//TCPMultiServer.fakeCDC.getItem( id );

break;
case "IDENTITY" :
this.identity = token[1];
ServerGameController.getInstance().playCreate(identity, clientSocket.getInetAddress());
try {
DataOutputStream outToClient = new DataOutputStream( clientSocket.getOutputStream() );
if(!ServerGameController.getInstance().playCreate(identity, new InetSocketAddress(clientSocket.getInetAddress(),clientSocket.getPort()))) {
outToClient.writeUTF("IdentityNotOK");
removeWorkerFromClientTable();
isStopped = true;
}else{
outToClient.writeUTF("IdentityOK");
}
}catch ( IOException e ){
System.out.println( "stringParsing : "+ e);
}
break;
case "DISCONNECT" :
// remove this player
System.out.print("hihihi");
//System.out.print("hihihi");
isStopped = true;
break;
case "ATK" :
int dir = Integer.valueOf( token[1] );
// System.out.println( "Dir : " + dir );
for (Player p : ServerGameController.getInstance().getCmd().getPlayerArrayList()) {
if( p.getId().equals( identity ) && p.getScore() !=0 ){
Timer timer = ServerGameController.getInstance().getBulletTimerMap().get(p);
timer.schedule( new BulletTask(p, dir) ,0, UDPBroadCastClient.getInstance().interval );
if(p.getScore() != 1) {
p.setScore( p.getScore()/2 );
}
break;
}
}
}
}
}
29 changes: 11 additions & 18 deletions src/ncu/sw/UDPSM/UDPBroadCastClient.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package ncu.sw.UDPSM;

import ncu.sw.TCPSM.TCPMultiServer;
import ncu.sw.gameUtility.Cmd;


import java.io.*;
import java.net.InetAddress;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Timer;
import java.net.InetSocketAddress;
import java.util.ArrayList;


public class UDPBroadCastClient {
Expand All @@ -17,8 +16,8 @@ public class UDPBroadCastClient {

private UDPListenThread udpListenThread;

private final int interval = 50;
private ArrayList<InetSocketAddress> UDPTable;
public final int interval = 50;
private HashMap<String,InetSocketAddress> UDPTable;

private static UDPBroadCastClient ourInstance;

Expand All @@ -29,23 +28,17 @@ public static UDPBroadCastClient getInstance() {
return ourInstance;
}
private UDPBroadCastClient() {
UDPTable = new ArrayList<InetSocketAddress>();
UDPTable = new HashMap<>();
}
public ArrayList<InetSocketAddress> getUDPTable() {
public HashMap<String,InetSocketAddress> getUDPTable() {
return UDPTable;
}
public void removeFromUDPTable(InetAddress address) {
System.out.print("remove has been called ");
for (int i =0;i<UDPTable.size(); i++) {
if(UDPTable.get(i).getAddress().equals(address)) {
UDPTable.remove(i);
}
}
public void startUDPListenThread(int port) {
udpListenThread = new UDPListenThread(port) ;
udpListenThread.start();
}
public void startUDPBroadcast(int port) {
System.out.print("!!");
udpListenThread = new UDPListenThread(port);
udpListenThread.start();
startUDPListenThread(port);
try {
new Timer().schedule( new UdpServerThread( udpListenThread.getSocket() ), Calendar.getInstance().getTime(), interval);
} catch (IOException e) {
Expand Down
20 changes: 7 additions & 13 deletions src/ncu/sw/UDPSM/UDPListenThread.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
package ncu.sw.UDPSM;

import java.net.*;
import java.util.Calendar;
import java.util.Timer;

/**
* Created by Kevin on 2016/12/22.
*/
public class UDPListenThread extends Thread {
private boolean check = true;
private DatagramSocket socket;
private InetAddress address;
private InetSocketAddress socketAddress;
private int port;
public UDPListenThread(int port) {
try {
Expand All @@ -27,22 +22,21 @@ public DatagramSocket getSocket() {
public synchronized void run() {
try {
while(check) {
byte[] buf = new byte[2];
byte[] buf = new byte[200];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
System.out.print( "I have to receive to go on.\n");
socket.receive(packet);
address = packet.getAddress();
port = packet.getPort();
UDPBroadCastClient.getInstance().getUDPTable().add(new InetSocketAddress(address, port));
InetSocketAddress socketAddress = new InetSocketAddress(address, port);
String id = new String (packet.getData(),"UTF-8");
UDPBroadCastClient.getInstance().getUDPTable().put(id.trim(),socketAddress);
System.out.print("it is first\n");
//socket = new DatagramSocket(5000);
//UDPBroadCastClient.getInstance().startUDPBroadcast(5000);
}
}
socket.close();
} catch (Exception e) {

e.printStackTrace();
check = false;
// check = false;
}
}
}
}
18 changes: 13 additions & 5 deletions src/ncu/sw/UDPSM/UdpServerThread.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import java.io.ObjectOutputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.TimerTask;
public class UdpServerThread extends TimerTask {
private Cmd cmd;
Expand All @@ -24,24 +26,30 @@ public UdpServerThread(DatagramSocket socket) throws IOException {
this.socket = socket;
}
public synchronized void run() {
HashMap map = UDPBroadCastClient.getInstance().getUDPTable();
try {
for(int i = 0; i<UDPBroadCastClient.getInstance().getUDPTable().size() ; i ++) {
address = UDPBroadCastClient.getInstance().getUDPTable().get(i).getAddress();
port = UDPBroadCastClient.getInstance().getUDPTable().get(i).getPort();
for (Object key : map.keySet()) {
address = UDPBroadCastClient.getInstance().getUDPTable().get(key).getAddress();
port = UDPBroadCastClient.getInstance().getUDPTable().get(key).getPort();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); //這邊應該算 encode 我們不採用message 的方式存取 , 我們送整個資料給client
ObjectOutputStream os = new ObjectOutputStream(outputStream);
os.writeObject(cmd);
os.writeObject( ServerGameController.getInstance().getCmd() );
os.flush();
byte[] data = outputStream.toByteArray();
packet = new DatagramPacket(data, //這邊在送
data.length, address, port);
socket.send(packet);
if(socket != null ) {
socket.send(packet);
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}catch (ConcurrentModificationException e){
System.out.println( " ConcurrentModificationException : " + e );
}
}
}
49 changes: 49 additions & 0 deletions src/ncu/sw/gameServer/BulletTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package ncu.sw.gameServer;
import ncu.sw.gameUtility.Coin;
import ncu.sw.gameUtility.Player;
import java.util.TimerTask;

/**
* Created by Kevin on 2016/12/25.
*/
public class BulletTask extends TimerTask {
private Coin bullet;
private int speed = 40;
private int cnt = 40;
private int xDir,yDir;

public BulletTask( Player player, int dir){
this.xDir = ServerGameController.getInstance().getMoveXMap().get(dir);
this.yDir = ServerGameController.getInstance().getMoveYMap().get(dir);
bullet = new Coin( player.getPositionX()+ xDir *player.getWidth() ,player.getPositionY() + yDir *player.getWidth() );
if(player.getScore() == 1) {
bullet.setPoint(1);
}
else {
bullet.setPoint( player.getScore()/2 );
}
ServerGameController.getInstance().getCmd().getCoinArrayList().add( bullet);
}
@Override
public void run() {
if( cnt > 0 ){
bullet.setPosition( bullet.getPositionX() + xDir * speed, bullet.getPositionY() + yDir * speed );
for (Player p : ServerGameController.getInstance().getCmd().getPlayerArrayList()){
if( ServerGameController.getInstance().isOverlay( p , bullet) ){
p.setScore( p.getScore() + bullet.getPoint() );
ServerGameController.getInstance().isEightySeven(p);
ServerGameController.getInstance().getCmd().getCoinArrayList().remove( bullet );
cancel();
}
else if (ServerGameController.getInstance().isOverlayWithObstacle(bullet) || ServerGameController.getInstance().boundary(bullet)) {
ServerGameController.getInstance().getCmd().getCoinArrayList().remove(bullet);
cancel();
}
}
cnt--;
}else{
ServerGameController.getInstance().getCmd().getCoinArrayList().remove( bullet );
cancel();
}
}
}
40 changes: 40 additions & 0 deletions src/ncu/sw/gameServer/ItemTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package ncu.sw.gameServer;

import ncu.sw.gameUtility.Player;

import java.util.Timer;
import java.util.TimerTask;

/**
* Created by NiHao on 2016/12/25.
*/
public class ItemTask extends TimerTask {
private int speed;
private int radius;
private int moveDir = 1;
private Player p;
private int taskCnt = 1;
public ItemTask(Player p ){
this.p = p;
speed = p.getSpeed();
radius = p.getRadius();
moveDir = p.getMoveDir();
System.out.print("it must happened\n");
}
@Override
public void run() {
if( taskCnt > 0) {
System.out.println( "ItemTask finished");
p.setSpeed( this.speed );
p.setRadius( this.radius );
p.setMoveDir( this.moveDir );
p.setEffectNum(0);
--taskCnt;
}
else{
System.out.println( "ItemTask cancel");
cancel();
}

}
}
13 changes: 1 addition & 12 deletions src/ncu/sw/gameServer/Main.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
package ncu.sw.gameServer;

import ncu.sw.TCPSM.TCPMultiServer;

import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException{
System.out.println("server main");
//launch(args);
// ServerGameController gameController = new ServerGameController(100,20,20);
ServerGameController gameController = ServerGameController.getInstance();
ServerGameController.getInstance();
new Thread( TCPMultiServer.getInstance()).start();

/*InetAddress address = InetAddress.getByName("127.0.0.1");
Player player = new Player(20,20,"Kevin",address);
gameController.getCmd().getPlayerArrayList().add(player);*/
//System.out.print(gameController.getCmd().getPlayerArrayList());


}
}
Loading