gameserver.java

来自「手机游戏对战平台。自己做的一个东东。 支持多个手机联网打游戏;采用socket」· Java 代码 · 共 140 行

JAVA
140
字号
package serverInf;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import model.PlatformState;
public class GameServer implements Runnable {
	public int port;
	public int maxclient;
	public Sender[] senders;
	public Receiver[] receivers;
        public String[] UserName; 
	public Serializable message;
	public ServerInterface serinf;
        public int clientIndex;
        
        ServerSocket serversocket = null;
	public GameServer(int port, int maxClient, Serializable message,
			ServerInterface serinf) {
		this.port = port;
		this.maxclient = maxClient;
		this.senders = new Sender[maxClient];
		this.receivers = new Receiver[maxClient];
                this.UserName=new String[maxClient];
		this.message = message;
		this.serinf = serinf;
	}
	
        public void start(){
            Thread t=new Thread(this);
            t.start();
        }
        
	public synchronized void run() {
		 
		try {                        
			serversocket = new ServerSocket(port);
			System.out.println("Server:"+port+" Wait for connection...");
			 clientIndex = 0;
			while (clientIndex < maxclient) {
                                DataInputStream is;
                                DataOutputStream os;
              
				Socket clientsocket = serversocket.accept();
         
				System.out.println("a client is accepted");
     
				 is = new DataInputStream(clientsocket.getInputStream());
                
				 os = new DataOutputStream(clientsocket.getOutputStream());
                                 UserName[clientIndex]=is.readUTF();
                                 System.out.println("User "+UserName[clientIndex]+" has logged in.");
        
				senders[clientIndex] = new Sender(os);

				serinf.getSenders(senders);

				receivers[clientIndex] = new Receiver(clientIndex,is,this,UserName[clientIndex]);

				clientIndex++;
			}
                         
                         for (int i=0;i<maxclient;i++){
                            while(senders[i].isReady()==false)
                                Thread.sleep(10);
                         }
                         for (int i=0;i<maxclient;i++){
                             while(receivers[i].isReady()==false)
                                Thread.sleep(10);                            
                         }        
                        serinf.gameStart();
                         
                } catch (Exception e) {
			System.out.println("error happen in gameserver's run(): "+e);
		}
                 }
	
}


class Receiver implements Runnable {
	
	private DataInputStream is = null;
	private ServerInterface serinf = null;
	private Serializable message = null;
        private GameServer gameserver=null;
        private int clientIndex;
        private boolean ready=false;
        private String userAccount=null;
        public boolean isReady() {
            return ready;
        }
        public String getUserAccount(){
            return userAccount;
        }
        
	public Receiver(int clientIndex,DataInputStream is, GameServer gameserver,String userAccount) {
            ready=false;
            this.userAccount=userAccount;
            this.clientIndex=clientIndex;
		this.is = is;
		this.serinf = gameserver.serinf;
		this.message = gameserver.message;
                this.gameserver=gameserver;
		start();
	}
	public void start() {
		Thread t = new Thread(this);
		t.start();
	}
	public void run() {
            synchronized (this) {
                try {

                    ready = true;
                    while (true) {
                        message.deserialize(is);
                        serinf.reveiveMessage(message);
                    }
                } catch (Exception e) {
                    PlatformState ps = new PlatformState();
                    ps.logout(userAccount);
                    serinf.illegalExit(userAccount);
                    System.out.println("close happen in receiver's run(): " + e);
                    if (gameserver.senders[this.clientIndex] != null) {
                        gameserver.senders[this.clientIndex].close();
                    }
                    gameserver.clientIndex--;
                    for (int i = this.clientIndex; i < gameserver.clientIndex; i++) {
                        gameserver.senders[i] = gameserver.senders[i + 1];
                        gameserver.receivers[i] = gameserver.receivers[i + 1];
                    }
                    gameserver.senders[gameserver.clientIndex] = null;
                    gameserver.serinf.getSenders(gameserver.senders);
                }
            }
        }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?